-A Python framework to build Slack apps in a flash with the latest platform features. Read the [getting started guide](https://tools.slack.dev/bolt-python/getting-started) and look at our [code examples](https://github.com/slackapi/bolt-python/tree/main/examples) to learn how to build apps using Bolt. The Python module documents are available [here](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/).
+A Python framework to build Slack apps in a flash with the latest platform features. Read the [getting started guide](https://docs.slack.dev/tools/bolt-python/getting-started) and look at our [code examples](https://github.com/slackapi/bolt-python/tree/main/examples) to learn how to build apps using Bolt. The Python module documents are available [here](https://docs.slack.dev/tools/bolt-python/reference/).
## Setup
@@ -192,7 +192,7 @@ Apps can be run the same way as the syncronous example above. If you'd prefer an
## Getting Help
-[The documentation](https://tools.slack.dev/bolt-python) has more information on basic and advanced concepts for Bolt for Python. Also, all the Python module documents of this library are available [here](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/).
+[The documentation](https://tools.slack.dev/bolt-python) has more information on basic and advanced concepts for Bolt for Python. Also, all the Python module documents of this library are available [here](https://tools.slack.dev/bolt-python/reference/).
If you otherwise get stuck, we're here to help. The following are the best ways to get assistance working through your issue:
diff --git a/docs/.gitignore b/docs/.gitignore
deleted file mode 100644
index 53a1610fd..000000000
--- a/docs/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-node_modules/
-.docusaurus
-build
\ No newline at end of file
diff --git a/docs/README.md b/docs/README.md
deleted file mode 100644
index 023d89975..000000000
--- a/docs/README.md
+++ /dev/null
@@ -1,129 +0,0 @@
-# tools.slack.dev/bolt-python
-
-This website is built using [Docusaurus](https://docusaurus.io/). 'Tis cool.
-
-Each Bolt/SDK has its own Docusaurus website, with matching CSS and nav/footer. There is also be a Docusaurus website of just the homepage and community tools.
-
-```
-website/
-├── docs/ (the good stuff. md and mdx files supported)
-│ ├── getting-started.md
-│ └── concepts
-│ └── sending-message.md
-├── i18n/ja/ (the japanese translations)
-│ ├──docusaurus-theme-classic/ (footer/navbar translations)
-│ └──docusaurus-plugin-content-docs/
-│ └── current/ ( file names need to exactly match **/docs/, but japanese content)
-│ ├── getting-started.md
-│ └── concepts
-│ └── sending-message.md
-├── static/
-│ ├── css/
-│ │ └── custom.css (the css for everything!)
-│ ├── img/ (the pictures for the site)
-│ │ ├── rory.png
-│ │ └── oslo.svg
-│ └── api-docs/slack_bolt (the generated reference docs with their own HTML/CSS)
-│ ├── index.html
-│ └── adaptor
-│ └── index.html
-├── src/
-│ ├── pages/ (stuff that isn't docs. This is empty for this repo!)
-│ └── theme/ (only contains the 404 page)
-├── docusaurus.config.js (main config file)
-├── footerConfig.js (footer. go to main repo to change)
-├── navbarConfig.js (navbar. go to main repo to change)
-└── sidebar.js (manually set where the docs are in the sidebar.)
-```
-
-A cheat-sheet:
-* _I want to edit a doc._ `docs/*/*.md`
-* _I want to edit a Japanese doc._ `i18n/ja-jp/docusaurus-plugin-content-docs/current/*/*.md`. See the [Japanese docs README](./docs/README.md)
-* _I want to change the docs sidebar._ `sidebar.js`
-* _I want to change the css._ Don't use this repo, use the home repo and the changes will propagate here.
-* _I want to change anything else._ `docusaurus.config.js`
-
-----
-
-## Adding a doc
-
-1. Make a markdown file. Add a `# Title` or use [front matter](https://docusaurus.io/docs/next/create-doc) with `title:`.
-2. Save it in `docs/folder/title.md` or `docs/title.md`, depending on if it's in a sidebar category. The nuance is just for internal organization.
-3. There needs to be 1:1 docs for the sidebar. Copy the folder/file and put it in the Japanese docs: `i18n/ja/docusaurus-plugin-content-docs/current/*`. Just leave it in English if you don't speak Japanese.
-4. Add the doc's path to the sidebar within `docusaurus.config.js`. Where ever makes most sense for you.
-5. Test the changes ↓
-
----
-
-## Running locally
-
-Docusaurus requires at least Node 18. You can update Node however you want. `nvm` is one way.
-
-Install `nvm` if you don't have it:
-
-```
-curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
-```
-
-Then grab the latest version of Node.
-
-```
-nvm install node
-```
-
-If you are running this project locally for the first time, you'll need to install the packages with the following command:
-
-```
-npm install
-```
-
-The following command starts a local development server and opens up a browser window.
-
-```
-npm run start
-```
-
-Edits to pages are reflected live — no restarting the server or reloading the page. (I'd say... 95% of the time, and 100% time if you're just editing a markdown file). The generated reference docs only load in prod!
-
-Remember — you're only viewing the Bolt for Python docs right now.
-
-#### Running locally in Japanese
-
-For local runs, Docusaurus treats each language as a different instance of the website. You'll want to specify the language to run the japanese site locally:
-
-```
-npm run start -- --locale ja-jp
-```
-
-Don't worry - both languages will be built/served on deployment.
-
----
-
-## Deploying
-
-The following command generates static content into the `build` directory.
-
-```
-$ npm run build
-```
-
-Then you can test out with the following command:
-
-```
-npm run serve
-```
-
-If it looks good, make a PR request!
-
-### Deployment to GitHub pages
-
-There is a GitHub action workflow set up in each repo.
-
-* On PR, it tests a site build.
-* On Merge, it builds the site and deploys it. Site should update in a minute or two.
-
----
-
-## Something's broken
-
-Luke goofed. Open an issue please! `:bufo-appreciates-the-insight:`
\ No newline at end of file
diff --git a/docs/babel.config.js b/docs/babel.config.js
deleted file mode 100644
index e00595dae..000000000
--- a/docs/babel.config.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
- presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
-};
diff --git a/docs/content/concepts/custom-steps.md b/docs/content/concepts/custom-steps.md
deleted file mode 100644
index 52e3d76e2..000000000
--- a/docs/content/concepts/custom-steps.md
+++ /dev/null
@@ -1,154 +0,0 @@
----
-title: Listening and responding to custom steps
-sidebar_label: Custom Steps
-lang: en
-slug: /concepts/custom-steps
----
-
-Your app can use the `function()` method to listen to incoming [custom step requests](https://docs.slack.dev/workflows/workflow-steps). Custom steps are used in Workflow Builder to build workflows. The method requires a step `callback_id` of type `str`. This `callback_id` must also be defined in your [Function](https://docs.slack.dev/reference/app-manifest#functions) definition. Custom steps must be finalized using the `complete()` or `fail()` listener arguments to notify Slack that your app has processed the request.
-
-* `complete()` requires **one** argument: `outputs` of type `dict`. It ends your custom step **successfully** and provides a dictionary containing the outputs of your custom step as per its definition.
-* `fail()` requires **one** argument: `error` of type `str`. It ends your custom step **unsuccessfully** and provides a message containing information regarding why your custom step failed.
-
-You can reference your custom step's inputs using the `inputs` listener argument of type `dict`.
-
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn about the available listener arguments.
-
-```python
-# This sample custom step formats an input and outputs it
-@app.function("sample_custom_step")
-def sample_step_callback(inputs: dict, fail: Fail, complete: Complete):
- try:
- message = inputs["message"]
- complete(
- outputs={
- "message": f":wave: You submitted the following message: \n\n>{message}"
- }
- )
- except Exception as e:
- fail(f"Failed to handle a custom step request (error: {e})")
- raise e
-```
-
-
-
-Example app manifest definition
-
-
-```json
-...
-"functions": {
- "sample_custom_step": {
- "title": "Sample custom step",
- "description": "Run a sample custom step",
- "input_parameters": {
- "message": {
- "type": "string",
- "title": "Message",
- "description": "A message to be formatted by the custom step",
- "is_required": true,
- }
- },
- "output_parameters": {
- "message": {
- "type": "string",
- "title": "Messge",
- "description": "A formatted message",
- "is_required": true,
- }
- }
- }
-}
-```
-
-
-
----
-
-### Listening to custom step interactivity events
-
-Your app's custom steps may create interactivity points for users, for example: Post a message with a button.
-
-If such interaction points originate from a custom step execution, the events sent to your app representing the end-user interaction with these points are considered to be _function-scoped interactivity events_. These interactivity events can be handled by your app using the same concepts we covered earlier, such as [Listening to actions](/concepts/action-listening).
-
-_function-scoped interactivity events_ will contain data related to the custom step (`function_executed` event) they were spawned from, such as custom step `inputs` and access to `complete()` and `fail()` listener arguments.
-
-Your app can skip calling `complete()` or `fail()` in the `function()` handler method if the custom step creates an interaction point that requires user interaction before the step can end. However, in the relevant interactivity handler method, your app must invoke `complete()` or `fail()` to notify Slack that the custom step has been processed.
-
-You’ll notice in all interactivity handler examples, `ack()` is used. It is required to call the `ack()` function within an interactivity listener to acknowledge that the request was received from Slack. This is discussed in the [acknowledging requests section](/concepts/acknowledge).
-
-```python
-# This sample custom step posts a message with a button
-@app.function("custom_step_button")
-def sample_step_callback(inputs, say, fail):
- try:
- say(
- channel=inputs["user_id"], # sending a DM to this user
- text="Click the button to signal the step completion",
- blocks=[
- {
- "type": "section",
- "text": {"type": "mrkdwn", "text": "Click the button to signal step completion"},
- "accessory": {
- "type": "button",
- "text": {"type": "plain_text", "text": "Complete step"},
- "action_id": "sample_click",
- },
- }
- ],
- )
- except Exception as e:
- fail(f"Failed to handle a function request (error: {e})")
-
-# Your listener will be called every time a block element with the action_id "sample_click" is triggered
-@app.action("sample_click")
-def handle_sample_click(ack, body, context, client, complete, fail):
- ack()
- try:
- # Since the button no longer works, we should remove it
- client.chat_update(
- channel=context.channel_id,
- ts=body["message"]["ts"],
- text="Congrats! You clicked the button",
- )
-
- # Signal that the custom step completed successfully
- complete({"user_id": context.actor_user_id})
- except Exception as e:
- fail(f"Failed to handle a function request (error: {e})")
-```
-
-
-
-Example app manifest definition
-
-
-```json
-...
-"functions": {
- "custom_step_button": {
- "title": "Custom step with a button",
- "description": "Custom step that waits for a button click",
- "input_parameters": {
- "user_id": {
- "type": "slack#/types/user_id",
- "title": "User",
- "description": "The recipient of a message with a button",
- "is_required": true,
- }
- },
- "output_parameters": {
- "user_id": {
- "type": "slack#/types/user_id",
- "title": "User",
- "description": "The user that completed the function",
- "is_required": true
- }
- }
- }
-}
-```
-
-
-
-Learn more about responding to interactivity, see the [Slack API documentation](https://docs.slack.dev/interactivity/handling-user-interaction).
diff --git a/docs/content/concepts/web-api.md b/docs/content/concepts/web-api.md
deleted file mode 100644
index 18b41a029..000000000
--- a/docs/content/concepts/web-api.md
+++ /dev/null
@@ -1,28 +0,0 @@
----
-title: Using the Web API
-lang: en
-slug: /concepts/web-api
----
-
-You can call [any Web API method](https://docs.slack.dev/reference/methods) using the [`WebClient`](https://tools.slack.dev/python-slack-sdk/web) provided to your Bolt app as either `app.client` or `client` in middleware/listener arguments (given that your app has the appropriate scopes). When you call one the client's methods, it returns a `SlackResponse` which contains the response from Slack.
-
-The token used to initialize Bolt can be found in the `context` object, which is required to call most Web API methods.
-
-:::info
-
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn the available listener arguments.
-
-:::
-
-```python
-@app.message("wake me up")
-def say_hello(client, message):
- # Unix Epoch time for September 30, 2020 11:59:59 PM
- when_september_ends = 1601510399
- channel_id = message["channel"]
- client.chat_scheduleMessage(
- channel=channel_id,
- post_at=when_september_ends,
- text="Summer has come and passed"
- )
-```
diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js
deleted file mode 100644
index 0d80161e6..000000000
--- a/docs/docusaurus.config.js
+++ /dev/null
@@ -1,114 +0,0 @@
-import { themes as prismThemes } from 'prism-react-renderer';
-const footer = require('./footerConfig');
-const navbar = require('./navbarConfig');
-
-/** @type {import('@docusaurus/types').Config} */
-const config = {
- title: "Bolt for Python",
- tagline: "Official frameworks, libraries, and SDKs for Slack developers",
- favicon: "img/favicon.ico",
- url: "https://tools.slack.dev",
- baseUrl: "/bolt-python/",
- organizationName: "slackapi",
- projectName: "bolt-python",
-
- onBrokenLinks: "ignore",
- onBrokenAnchors: "warn",
- onBrokenMarkdownLinks: "warn",
-
- i18n: {
- defaultLocale: "en",
- locales: ["en", "ja-jp"],
- },
-
- presets: [
- [
- "classic",
- /** @type {import('@docusaurus/preset-classic').Options} */
- ({
- docs: {
- path: "content",
- breadcrumbs: false,
- routeBasePath: "/", // Serve the docs at the site's root
- sidebarPath: "./sidebars.js",
- editUrl: "https://github.com/slackapi/bolt-python/tree/main/docs",
- },
- blog: false,
- theme: {
- customCss: "./src/css/custom.css",
- },
- }),
- ],
- ],
-
- plugins: [
- "docusaurus-theme-github-codeblock",
- [
- "@docusaurus/plugin-client-redirects",
- {
- redirects: [
- {
- to: "/getting-started",
- from: ["/tutorial/getting-started"],
- },
- {
- to: "/",
- from: ["/concepts", "/concepts/basic", "/concepts/advanced"],
- },
- {
- to: '/concepts/actions',
- from: [
- '/concepts/action-listening',
- '/concepts/action-responding'
- ],
- },
- {
- to: '/legacy/steps-from-apps',
- from: [
- '/concepts/steps',
- '/concepts/creating-steps',
- '/concepts/adding-editing-steps',
- '/concepts/saving-steps',
- '/concepts/executing-steps'
- ],
- },
- {
- to: '/concepts/ai-apps',
- from: '/concepts/assistant'
- }
- ],
- },
- ],
- ],
-
- themeConfig:
- /** @type {import('@docusaurus/preset-classic').ThemeConfig} */
- ({
- colorMode: {
- respectPrefersColorScheme: true,
- },
- docs: {
- sidebar: {
- autoCollapseCategories: true,
- },
- },
- navbar,
- footer,
- prism: {
- // switch to alucard when available in prism?
- theme: prismThemes.github,
- darkTheme: prismThemes.dracula,
- additionalLanguages: ['bash'],
- },
- codeblock: {
- showGithubLink: true,
- githubLinkLabel: "View on GitHub",
- },
- // announcementBar: {
- // id: `announcementBar`,
- // content: `🎉️ Version 2.26.0 of the developer tools for the Slack automations platform is here! 🎉️ `,
- // },
- }),
-};
-
-export default config;
diff --git a/docs/english/_sidebar.json b/docs/english/_sidebar.json
new file mode 100644
index 000000000..d42868543
--- /dev/null
+++ b/docs/english/_sidebar.json
@@ -0,0 +1,209 @@
+[
+ {
+ "type": "doc",
+ "id": "tools/bolt-python/index",
+ "label": "Bolt for Python",
+ "className": "sidebar-title"
+ },
+ "tools/bolt-python/getting-started",
+ { "type": "html", "value": "" },
+ "tools/bolt-python/building-an-app",
+ {
+ "type": "category",
+ "label": "Slack API calls",
+ "items": [
+ "tools/bolt-python/concepts/message-sending",
+ "tools/bolt-python/concepts/web-api"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Events",
+ "items": [
+ "tools/bolt-python/concepts/message-listening",
+ "tools/bolt-python/concepts/event-listening"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "App UI & Interactivity",
+ "items": [
+ "tools/bolt-python/concepts/acknowledge",
+ "tools/bolt-python/concepts/shortcuts",
+ "tools/bolt-python/concepts/commands",
+ "tools/bolt-python/concepts/actions",
+ "tools/bolt-python/concepts/opening-modals",
+ "tools/bolt-python/concepts/updating-pushing-views",
+ "tools/bolt-python/concepts/view-submissions",
+ "tools/bolt-python/concepts/select-menu-options",
+ "tools/bolt-python/concepts/app-home"
+ ]
+ },
+ "tools/bolt-python/concepts/ai-apps",
+ {
+ "type": "category",
+ "label": "Custom Steps",
+ "items": [
+ "tools/bolt-python/concepts/custom-steps",
+ "tools/bolt-python/concepts/custom-steps-dynamic-options"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "App Configuration",
+ "items": [
+ "tools/bolt-python/concepts/socket-mode",
+ "tools/bolt-python/concepts/errors",
+ "tools/bolt-python/concepts/logging",
+ "tools/bolt-python/concepts/async"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Middleware & Context",
+ "items": [
+ "tools/bolt-python/concepts/global-middleware",
+ "tools/bolt-python/concepts/listener-middleware",
+ "tools/bolt-python/concepts/context"
+ ]
+ },
+ "tools/bolt-python/concepts/lazy-listeners",
+ {
+ "type": "category",
+ "label": "Adaptors",
+ "items": [
+ "tools/bolt-python/concepts/adapters",
+ "tools/bolt-python/concepts/custom-adapters"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Authorization & Security",
+ "items": [
+ "tools/bolt-python/concepts/authenticating-oauth",
+ "tools/bolt-python/concepts/authorization",
+ "tools/bolt-python/concepts/token-rotation"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Legacy",
+ "items": ["tools/bolt-python/legacy/steps-from-apps"]
+ },
+ { "type": "html", "value": "" },
+ {
+ "type": "category",
+ "label": "Tutorials",
+ "items": [
+ "tools/bolt-python/tutorial/ai-chatbot/ai-chatbot",
+ "tools/bolt-python/tutorial/custom-steps",
+ "tools/bolt-python/tutorial/custom-steps-for-jira/custom-steps-for-jira",
+ "tools/bolt-python/tutorial/custom-steps-workflow-builder-new/custom-steps-workflow-builder-new",
+ "tools/bolt-python/tutorial/custom-steps-workflow-builder-existing/custom-steps-workflow-builder-existing",
+ "tools/bolt-python/tutorial/modals/modals"
+ ]
+ },
+ { "type": "html", "value": "" },
+ {
+ "type": "link",
+ "label": "Reference",
+ "href": "https://docs.slack.dev/tools/bolt-python/reference/index.html"
+ },
+ { "type": "html", "value": "" },
+ {
+ "type": "category",
+ "label": "日本語 (日本)",
+ "items": [
+ "tools/bolt-python/ja-jp/getting-started",
+ {
+ "type": "category",
+ "label": "Slack API コール",
+ "items": [
+ "tools/bolt-python/ja-jp/concepts/message-sending",
+ "tools/bolt-python/ja-jp/concepts/web-api"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "イベント API",
+ "items": [
+ "tools/bolt-python/ja-jp/concepts/message-listening",
+ "tools/bolt-python/ja-jp/concepts/event-listening"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "インタラクティビティ & ショートカット",
+ "items": [
+ "tools/bolt-python/ja-jp/concepts/acknowledge",
+ "tools/bolt-python/ja-jp/concepts/shortcuts",
+ "tools/bolt-python/ja-jp/concepts/commands",
+ "tools/bolt-python/ja-jp/concepts/actions",
+ "tools/bolt-python/ja-jp/concepts/opening-modals",
+ "tools/bolt-python/ja-jp/concepts/updating-pushing-views",
+ "tools/bolt-python/ja-jp/concepts/view-submissions",
+ "tools/bolt-python/ja-jp/concepts/select-menu-options",
+ "tools/bolt-python/ja-jp/concepts/app-home"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "App の設定",
+ "items": [
+ "tools/bolt-python/ja-jp/concepts/socket-mode",
+ "tools/bolt-python/ja-jp/concepts/errors",
+ "tools/bolt-python/ja-jp/concepts/logging",
+ "tools/bolt-python/ja-jp/concepts/async"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "ミドルウェア & コンテキスト",
+ "items": [
+ "tools/bolt-python/ja-jp/concepts/global-middleware",
+ "tools/bolt-python/ja-jp/concepts/listener-middleware",
+ "tools/bolt-python/ja-jp/concepts/context"
+ ]
+ },
+ "tools/bolt-python/ja-jp/concepts/lazy-listeners",
+ {
+ "type": "category",
+ "label": "アダプター",
+ "items": [
+ "tools/bolt-python/ja-jp/concepts/adapters",
+ "tools/bolt-python/ja-jp/concepts/custom-adapters"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "認可 & セキュリティ",
+ "items": [
+ "tools/bolt-python/ja-jp/concepts/authenticating-oauth",
+ "tools/bolt-python/ja-jp/concepts/authorization",
+ "tools/bolt-python/ja-jp/concepts/token-rotation"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "レガシー(非推奨)",
+ "items": ["tools/bolt-python/ja-jp/legacy/steps-from-apps"]
+ }
+ ]
+ },
+ { "type": "html", "value": "" },
+ {
+ "type": "link",
+ "label": "Release notes",
+ "href": "https://github.com/slackapi/bolt-python/releases"
+ },
+ {
+ "type": "link",
+ "label": "Code on GitHub",
+ "href": "https://github.com/SlackAPI/bolt-python"
+ },
+ {
+ "type": "link",
+ "label": "Contributors Guide",
+ "href": "https://github.com/SlackAPI/bolt-python/blob/main/.github/contributing.md"
+ }
+]
diff --git a/docs/content/building-an-app.md b/docs/english/building-an-app.md
similarity index 81%
rename from docs/content/building-an-app.md
rename to docs/english/building-an-app.md
index deb3146b9..87b26163b 100644
--- a/docs/content/building-an-app.md
+++ b/docs/english/building-an-app.md
@@ -1,5 +1,4 @@
---
-title: Building an App with Bolt for Python
sidebar_label: Building an App
---
@@ -24,31 +23,31 @@ After you fill out an app name (_you can change it later_) and pick a workspace
This page contains an overview of your app in addition to important credentials you'll need later.
-
+
Look around, add an app icon and description, and then let's start configuring your app 🔩
---
### Tokens and installing apps {#tokens-and-installing-apps}
-Slack apps use [OAuth to manage access to Slack's APIs](https://docs.slack.dev/authentication/installing-with-oauth). When an app is installed, you'll receive a token that the app can use to call API methods.
+Slack apps use [OAuth to manage access to Slack's APIs](/authentication/installing-with-oauth). When an app is installed, you'll receive a token that the app can use to call API methods.
There are three main token types available to a Slack app: user (`xoxp`), bot (`xoxb`), and app-level (`xapp`) tokens.
-- [User tokens](https://docs.slack.dev/authentication/tokens#user) allow you to call API methods on behalf of users after they install or authenticate the app. There may be several user tokens for a single workspace.
-- [Bot tokens](https://docs.slack.dev/authentication/tokens#bot) are associated with bot users, and are only granted once in a workspace where someone installs the app. The bot token your app uses will be the same no matter which user performed the installation. Bot tokens are the token type that _most_ apps use.
-- [App-level tokens](https://docs.slack.dev/authentication/tokens#app-level) represent your app across organizations, including installations by all individual users on all workspaces in a given organization and are commonly used for creating WebSocket connections to your app.
+- [User tokens](/authentication/tokens#user) allow you to call API methods on behalf of users after they install or authenticate the app. There may be several user tokens for a single workspace.
+- [Bot tokens](/authentication/tokens#bot) are associated with bot users, and are only granted once in a workspace where someone installs the app. The bot token your app uses will be the same no matter which user performed the installation. Bot tokens are the token type that _most_ apps use.
+- [App-level tokens](/authentication/tokens#app-level) represent your app across organizations, including installations by all individual users on all workspaces in a given organization and are commonly used for creating WebSocket connections to your app.
We're going to use bot and app-level tokens for this guide.
1. Navigate to **OAuth & Permissions** on the left sidebar and scroll down to the **Bot Token Scopes** section. Click **Add an OAuth Scope**.
-2. For now, we'll just add one scope: [`chat:write`](https://docs.slack.dev/reference/scopes/chat.write). This grants your app the permission to post messages in channels it's a member of.
+2. For now, we'll just add one scope: [`chat:write`](/reference/scopes/chat.write). This grants your app the permission to post messages in channels it's a member of.
3. Scroll up to the top of the **OAuth & Permissions** page and click **Install App to Workspace**. You'll be led through Slack's OAuth UI, where you should allow your app to be installed to your development workspace.
4. Once you authorize the installation, you'll land on the **OAuth & Permissions** page and see a **Bot User OAuth Access Token**.
-
+
5. Head over to **Basic Information** and scroll down under the App Token section and click **Generate Token and Scopes** to generate an app-level token. Add the `connections:write` scope to this token and save the generated `xapp` token.
@@ -56,7 +55,7 @@ We're going to use bot and app-level tokens for this guide.
:::tip[Not sharing is sometimes caring]
-Treat your tokens like passwords and [keep them safe](https://docs.slack.dev/authentication/best-practices-for-security). Your app uses tokens to post and retrieve information from Slack workspaces.
+Treat your tokens like passwords and [keep them safe](/authentication/best-practices-for-security). Your app uses tokens to post and retrieve information from Slack workspaces.
:::
@@ -104,7 +103,7 @@ $ export SLACK_APP_TOKEN=
:::warning[Keep it secret. Keep it safe.]
-Remember to keep your tokens secure. At a minimum, you should avoid checking them into public version control, and access them via environment variables as we've done above. Check out the API documentation for more on [best practices for app security](https://docs.slack.dev/authentication/best-practices-for-security).
+Remember to keep your tokens secure. At a minimum, you should avoid checking them into public version control, and access them via environment variables as we've done above. Check out the API documentation for more on [best practices for app security](/authentication/best-practices-for-security).
:::
@@ -142,9 +141,9 @@ Your app should let you know that it's up and running. 🎉
### Setting up events {#setting-up-events}
Your app behaves similarly to people on your team — it can post messages, add emoji reactions, and listen and respond to events.
-To listen for events happening in a Slack workspace (like when a message is posted or when a reaction is posted to a message) you'll use the [Events API to subscribe to event types](https://docs.slack.dev/apis/events-api/).
+To listen for events happening in a Slack workspace (like when a message is posted or when a reaction is posted to a message) you'll use the [Events API to subscribe to event types](/apis/events-api/).
-For those just starting, we recommend using [Socket Mode](https://docs.slack.dev/apis/events-api/using-socket-mode). Socket Mode allows your app to use the Events API and interactive features without exposing a public HTTP Request URL. This can be helpful during development, or if you're receiving requests from behind a firewall.
+For those just starting, we recommend using [Socket Mode](/apis/events-api/using-socket-mode). Socket Mode allows your app to use the Events API and interactive features without exposing a public HTTP Request URL. This can be helpful during development, or if you're receiving requests from behind a firewall.
That being said, you're welcome to set up an app with a public HTTP Request URL. HTTP is more useful for apps being deployed to hosting environments to respond within a large corporate Slack workspaces/organization, or apps intended for distribution via the Slack Marketplace.
@@ -169,11 +168,11 @@ When an event occurs, Slack will send your app some information about the event,
1. Go back to your app configuration page (click on the app [from your app management page](https://api.slack.com/apps)). Click **Event Subscriptions** on the left sidebar. Toggle the switch labeled **Enable Events**.
-2. Add your Request URL. Slack will send HTTP POST requests corresponding to events to this [Request URL](https://docs.slack.dev/apis/events-api/#subscribing) endpoint. Bolt uses the `/slack/events` path to listen to all incoming requests (whether shortcuts, events, or interactivity payloads). When configuring your Request URL within your app configuration, you'll append `/slack/events`, e.g. `https:///slack/events`. 💡 As long as your Bolt app is still running, your URL should become verified.
+2. Add your Request URL. Slack will send HTTP POST requests corresponding to events to this [Request URL](/apis/events-api/#subscribing) endpoint. Bolt uses the `/slack/events` path to listen to all incoming requests (whether shortcuts, events, or interactivity payloads). When configuring your Request URL within your app configuration, you'll append `/slack/events`, e.g. `https:///slack/events`. 💡 As long as your Bolt app is still running, your URL should become verified.
:::tip[Using proxy services]
-For local development, you can use a proxy service like ngrok to create a public URL and tunnel requests to your development environment. Refer to [ngrok's getting started guide](https://ngrok.com/docs#getting-started-expose) on how to create this tunnel. And when you get to hosting your app, we've collected some of the most common hosting providers Slack developers use to host their apps [on our API site](https://docs.slack.dev/distribution/hosting-slack-apps/).
+For local development, you can use a proxy service like ngrok to create a public URL and tunnel requests to your development environment. Refer to [ngrok's getting started guide](https://ngrok.com/docs#getting-started-expose) on how to create this tunnel. And when you get to hosting your app, we've collected some of the most common hosting providers Slack developers use to host their apps [on our API site](/app-management/hosting-slack-apps).
:::
@@ -181,10 +180,10 @@ For local development, you can use a proxy service like ngrok to create a public
Navigate to **Event Subscriptions** on the left sidebar and toggle to enable. Under **Subscribe to Bot Events**, you can add events for your bot to respond to. There are four events related to messages:
-- [`message.channels`](https://docs.slack.dev/reference/events/message.channels) listens for messages in public channels that your app is added to.
-- [`message.groups`](https://docs.slack.dev/reference/events/message.groups) listens for messages in 🔒 private channels that your app is added to.
-- [`message.im`](https://docs.slack.dev/reference/events/message.im) listens for messages in your app's DMs with users.
-- [`message.mpim`](https://docs.slack.dev/reference/events/message.mpim) listens for messages in multi-person DMs that your app is added to.
+- [`message.channels`](/reference/events/message.channels) listens for messages in public channels that your app is added to.
+- [`message.groups`](/reference/events/message.groups) listens for messages in 🔒 private channels that your app is added to.
+- [`message.im`](/reference/events/message.im) listens for messages in your app's DMs with users.
+- [`message.mpim`](/reference/events/message.mpim) listens for messages in multi-person DMs that your app is added to.
If you want your bot to listen to messages from everywhere it is added to, choose all four message events. After you’ve selected the events you want your bot to listen to, click the green **Save Changes** button.
@@ -208,7 +207,7 @@ app = App(token=os.environ.get("SLACK_BOT_TOKEN"))
# Listens to incoming messages that contain "hello"
# To learn available listener arguments,
-# visit https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html
+# visit https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html
@app.message("hello")
def message_hello(message, say):
# say() sends a message to the channel where the event was triggered
@@ -234,7 +233,7 @@ app = App(
# Listens to incoming messages that contain "hello"
# To learn available listener arguments,
-# visit https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html
+# visit https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html
@app.message("hello")
def message_hello(message, say):
# say() sends a message to the channel where the event was triggered
@@ -268,9 +267,9 @@ With Socket Mode on, basic interactivity is enabled by default, so no further ac
Similar to events, you'll need to specify a URL for Slack to send the action (such as _user clicked a button_). Back on your app configuration page, click on **Interactivity & Shortcuts** on the left side. You'll see that there's another **Request URL** box.
-:::tip
+:::tip[By default, Bolt is configured to use the same endpoint for interactive components that it uses for events, so use the same request URL as above (for example, `https://8e8ec2d7.ngrok.io/slack/events`).]
-By default, Bolt is configured to use the same endpoint for interactive components that it uses for events, so use the same request URL as above (for example, `https://8e8ec2d7.ngrok.io/slack/events`). Press the **Save Changes** button in the lower right hand corner, and that's it. Your app is set up to handle interactivity!
+Press the **Save Changes** button in the lower right hand corner, and that's it. Your app is set up to handle interactivity!
:::
@@ -476,8 +475,8 @@ Now that you have a basic app up and running, you can start exploring how to mak
* Read through the concepts pages to learn about the different methods and features your Bolt app has access to.
-* Explore the different events your bot can listen to with the [`app.event()`](/concepts/event-listening) method. All of the events are listed [on the API docs site](https://docs.slack.dev/reference/events).
+* Explore the different events your bot can listen to with the [`app.event()`](/tools/bolt-python/concepts/event-listening) method. All of the events are listed [on the API docs site](/reference/events).
-* Bolt allows you to [call Web API methods](/concepts/web-api) with the client attached to your app. There are [over 200 methods](https://docs.slack.dev/reference/methods) on our API site.
+* Bolt allows you to [call Web API methods](/tools/bolt-python/concepts/web-api) with the client attached to your app. There are [over 200 methods](/reference/methods) on our API site.
-* Learn more about the different token types [on the API docs site](https://docs.slack.dev/authentication/tokens). Your app may need different tokens depending on the actions you want it to perform.
+* Learn more about the different token types [on the API docs site](/authentication/tokens). Your app may need different tokens depending on the actions you want it to perform.
diff --git a/docs/content/concepts/acknowledge.md b/docs/english/concepts/acknowledge.md
similarity index 60%
rename from docs/content/concepts/acknowledge.md
rename to docs/english/concepts/acknowledge.md
index 5e5c0ed25..7d91e0851 100644
--- a/docs/content/concepts/acknowledge.md
+++ b/docs/english/concepts/acknowledge.md
@@ -1,22 +1,16 @@
----
-title: Acknowledging requests
-lang: en
-slug: /concepts/acknowledge
----
+# Acknowledging requests
Actions, commands, shortcuts, options requests, and view submissions must **always** be acknowledged using the `ack()` function. This lets Slack know that the request was received so that it may update the Slack user interface accordingly.
-Depending on the type of request, your acknowledgement may be different. For example, when acknowledging a menu selection associated with an external data source, you would call `ack()` with a list of relevant [options](https://docs.slack.dev/reference/block-kit/composition-objects/option-object/). When acknowledging a view submission, you may supply a `response_action` as part of your acknowledgement to [update the view](/concepts/view_submissions).
+Depending on the type of request, your acknowledgement may be different. For example, when acknowledging a menu selection associated with an external data source, you would call `ack()` with a list of relevant [options](/reference/block-kit/composition-objects/option-object/). When acknowledging a view submission, you may supply a `response_action` as part of your acknowledgement to [update the view](/tools/bolt-python/concepts/view-submissions).
We recommend calling `ack()` right away before initiating any time-consuming processes such as fetching information from your database or sending a new message, since you only have 3 seconds to respond before Slack registers a timeout error.
-:::info
-
-When working in a FaaS / serverless environment, our guidelines for when to `ack()` are different. See the section on [Lazy listeners (FaaS)](/concepts/lazy-listeners) for more detail on this.
+:::info[When working in a FaaS / serverless environment, our guidelines for when to `ack()` are different. See the section on [Lazy listeners (FaaS)](/tools/bolt-python/concepts/lazy-listeners) for more detail on this.]
:::
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn the available listener arguments.
+Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.
```python
# Example of responding to an external_select options request
@app.options("menu_selection")
diff --git a/docs/content/concepts/actions.md b/docs/english/concepts/actions.md
similarity index 74%
rename from docs/content/concepts/actions.md
rename to docs/english/concepts/actions.md
index 018642b4a..d7dfa6ba1 100644
--- a/docs/content/concepts/actions.md
+++ b/docs/english/concepts/actions.md
@@ -1,8 +1,4 @@
----
-title: Listening & responding to actions
-lang: en
-slug: /concepts/actions
----
+# Listening & responding to actions
Your app can listen and respond to user actions, like button clicks, and menu selects, using the `action` method.
@@ -10,9 +6,9 @@ Your app can listen and respond to user actions, like button clicks, and menu se
Actions can be filtered on an `action_id` parameter of type `str` or `re.Pattern`. The `action_id` parameter acts as a unique identifier for interactive components on the Slack platform.
-You'll notice in all `action()` examples, `ack()` is used. It is required to call the `ack()` function within an action listener to acknowledge that the request was received from Slack. This is discussed in the [acknowledging requests guide](/concepts/acknowledge).
+You'll notice in all `action()` examples, `ack()` is used. It is required to call the `ack()` function within an action listener to acknowledge that the request was received from Slack. This is discussed in the [acknowledging requests guide](/tools/bolt-python/concepts/acknowledge).
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn the available listener arguments.
+Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.
```python
# Your listener will be called every time a block element with the action_id "approve_button" is triggered
@@ -49,7 +45,7 @@ There are two main ways to respond to actions. The first (and most common) way i
The second way to respond to actions is using `respond()`, which is a utility to use the `response_url` associated with the action.
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn the available listener arguments.
+Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.
```python
# Your listener will be called every time an interactive component with the action_id “approve_button” is triggered
@@ -62,7 +58,7 @@ def approve_request(ack, say):
### Using `respond()` method
-Since `respond()` is a utility for calling the `response_url`, it behaves in the same way. You can pass [all the message payload properties](https://docs.slack.dev/messaging/#payloads) as keyword arguments along with optional properties like `response_type` (which has a value of `"in_channel"` or `"ephemeral"`), `replace_original`, `delete_original`, `unfurl_links`, and `unfurl_media`. With that, your app can send a new message payload that will be published back to the source of the original interaction.
+Since `respond()` is a utility for calling the `response_url`, it behaves in the same way. You can pass [all the message payload properties](/messaging/#payloads) as keyword arguments along with optional properties like `response_type` (which has a value of `"in_channel"` or `"ephemeral"`), `replace_original`, `delete_original`, `unfurl_links`, and `unfurl_media`. With that, your app can send a new message payload that will be published back to the source of the original interaction.
```python
# Listens to actions triggered with action_id of “user_select”
diff --git a/docs/content/concepts/adapters.md b/docs/english/concepts/adapters.md
similarity index 97%
rename from docs/content/concepts/adapters.md
rename to docs/english/concepts/adapters.md
index ad4303b15..321dae0ab 100644
--- a/docs/content/concepts/adapters.md
+++ b/docs/english/concepts/adapters.md
@@ -1,8 +1,4 @@
----
-title: Adapters
-lang: en
-slug: /concepts/adapters
----
+# Adapters
Adapters are responsible for handling and parsing incoming requests from Slack to conform to [`BoltRequest`](https://github.com/slackapi/bolt-python/blob/main/slack_bolt/request/request.py), then dispatching those requests to your Bolt app.
diff --git a/docs/content/concepts/ai-apps.md b/docs/english/concepts/ai-apps.md
similarity index 79%
rename from docs/content/concepts/ai-apps.md
rename to docs/english/concepts/ai-apps.md
index a8da2bf1f..b294c6688 100644
--- a/docs/content/concepts/ai-apps.md
+++ b/docs/english/concepts/ai-apps.md
@@ -1,40 +1,36 @@
----
-title: Using AI in Apps
-lang: en
-slug: /concepts/ai-apps
----
+# Using AI in Apps
-:::info This feature requires a paid plan
+:::info[This feature requires a paid plan]
If you don't have a paid workspace for development, you can join the [Developer Program](https://api.slack.com/developer-program) and provision a sandbox with access to all Slack features for free.
:::
-The Agents & AI Apps feature comprises a unique messaging experience for Slack. If you're unfamiliar with using the Agents & AI Apps feature within Slack, you'll want to read the [API documentation on the subject](https://docs.slack.dev/ai/). Then come back here to implement them with Bolt!
+The Agents & AI Apps feature comprises a unique messaging experience for Slack. If you're unfamiliar with using the Agents & AI Apps feature within Slack, you'll want to read the [API documentation on the subject](/ai/). Then come back here to implement them with Bolt!
## Configuring your app to support AI features {#configuring-your-app}
1. Within [App Settings](https://api.slack.com/apps), enable the **Agents & AI Apps** feature.
2. Within the App Settings **OAuth & Permissions** page, add the following scopes:
-* [`assistant:write`](https://docs.slack.dev/reference/scopes/assistant.write)
-* [`chat:write`](https://docs.slack.dev/reference/scopes/chat.write)
-* [`im:history`](https://docs.slack.dev/reference/scopes/im.history)
+* [`assistant:write`](/reference/scopes/assistant.write)
+* [`chat:write`](/reference/scopes/chat.write)
+* [`im:history`](/reference/scopes/im.history)
3. Within the App Settings **Event Subscriptions** page, subscribe to the following events:
-* [`assistant_thread_started`](https://docs.slack.dev/reference/events/assistant_thread_started)
-* [`assistant_thread_context_changed`](https://docs.slack.dev/reference/events/assistant_thread_context_changed)
-* [`message.im`](https://docs.slack.dev/reference/events/message.im)
+* [`assistant_thread_started`](/reference/events/assistant_thread_started)
+* [`assistant_thread_context_changed`](/reference/events/assistant_thread_context_changed)
+* [`message.im`](/reference/events/message.im)
-:::info
-You _could_ go it alone and [listen](event-listening) for the `assistant_thread_started`, `assistant_thread_context_changed`, and `message.im` events (see implementation details below) in order to implement the AI features in your app. That being said, using the `Assistant` class will streamline the process. And we already wrote this nice guide for you!
-:::
+:::info[You _could_ implement your own AI app by [listening](event-listening) for the `assistant_thread_started`, `assistant_thread_context_changed`, and `message.im` events (see implementation details below).]
+
+That being said, using the `Assistant` class will streamline the process. And we already wrote this nice guide for you!
## The `Assistant` class instance {#assistant-class}
The `Assistant` class can be used to handle the incoming events expected from a user interacting with an app in Slack that has the Agents & AI Apps feature enabled. A typical flow would look like:
-1. [The user starts a thread](#handling-a-new-thread). The `Assistant` class handles the incoming [`assistant_thread_started`](https://docs.slack.dev/reference/events/assistant_thread_started) event.
-2. [The thread context may change at any point](#handling-thread-context-changes). The `Assistant` class can handle any incoming [`assistant_thread_context_changed`](https://docs.slack.dev/reference/events/assistant_thread_context_changed) events. The class also provides a default context store to keep track of thread context changes as the user moves through Slack.
-3. [The user responds](#handling-the-user-response). The `Assistant` class handles the incoming [`message.im`](https://docs.slack.dev/reference/events/message.im) event.
+1. [The user starts a thread](#handling-a-new-thread). The `Assistant` class handles the incoming [`assistant_thread_started`](/reference/events/assistant_thread_started) event.
+2. [The thread context may change at any point](#handling-thread-context-changes). The `Assistant` class can handle any incoming [`assistant_thread_context_changed`](/reference/events/assistant_thread_context_changed) events. The class also provides a default context store to keep track of thread context changes as the user moves through Slack.
+3. [The user responds](#handling-the-user-response). The `Assistant` class handles the incoming [`message.im`](/reference/events/message.im) event.
```python
@@ -97,25 +93,25 @@ def respond_in_assistant_thread(
app.use(assistant)
```
-While the `assistant_thread_started` and `assistant_thread_context_changed` events do provide Slack-client thread context information, the `message.im` event does not. Any subsequent user message events won't contain thread context data. For that reason, Bolt not only provides a way to store thread context — the `threadContextStore` property — but it also provides an instance that is utilized by default. This implementation relies on storing and retrieving [message metadata](https://docs.slack.dev/messaging/message-metadata/) as the user interacts with the app.
+While the `assistant_thread_started` and `assistant_thread_context_changed` events do provide Slack-client thread context information, the `message.im` event does not. Any subsequent user message events won't contain thread context data. For that reason, Bolt not only provides a way to store thread context — the `threadContextStore` property — but it also provides an instance that is utilized by default. This implementation relies on storing and retrieving [message metadata](/messaging/message-metadata/) as the user interacts with the app.
If you do provide your own `threadContextStore` property, it must feature `get` and `save` methods.
-:::tip
-Refer to the [module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn the available listener arguments.
+:::tip[Refer to the [module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.]
:::
## Handling a new thread {#handling-a-new-thread}
-When the user opens a new thread with your AI-enabled app, the [`assistant_thread_started`](https://docs.slack.dev/reference/events/assistant_thread_started) event will be sent to your app.
+When the user opens a new thread with your AI-enabled app, the [`assistant_thread_started`](/reference/events/assistant_thread_started) event will be sent to your app.
+
+:::tip[When a user opens an app thread while in a channel, the channel info is stored as the thread's `AssistantThreadContext` data.]
-:::tip
-When a user opens an app thread while in a channel, the channel info is stored as the thread's `AssistantThreadContext` data. You can grab that info by using the `get_thread_context` utility, as subsequent user message event payloads won't include the channel info.
+You can grab that info by using the `get_thread_context` utility, as subsequent user message event payloads won't include the channel info.
:::
### Block Kit interactions in the app thread {#block-kit-interactions}
-For advanced use cases, Block Kit buttons may be used instead of suggested prompts, as well as the sending of messages with structured [metadata](https://docs.slack.dev/messaging/message-metadata/) to trigger subsequent interactions with the user.
+For advanced use cases, Block Kit buttons may be used instead of suggested prompts, as well as the sending of messages with structured [metadata](/messaging/message-metadata/) to trigger subsequent interactions with the user.
For example, an app can display a button such as "Summarize the referring channel" in the initial reply. When the user clicks the button and submits detailed information (such as the number of messages, days to check, purpose of the summary, etc.), the app can handle that information and post a message that describes the request with structured metadata.
@@ -241,9 +237,9 @@ def respond_to_bot_messages(logger: logging.Logger, set_status: SetStatus, say:
## Handling thread context changes {#handling-thread-context-changes}
-When the user switches channels, the [`assistant_thread_context_changed`](https://docs.slack.dev/reference/events/assistant_thread_context_changed) event will be sent to your app.
+When the user switches channels, the [`assistant_thread_context_changed`](/reference/events/assistant_thread_context_changed) event will be sent to your app.
-If you use the built-in `Assistant` middleware without any custom configuration, the updated context data is automatically saved as [message metadata](https://docs.slack.dev/messaging/message-metadata/) of the first reply from the app.
+If you use the built-in `Assistant` middleware without any custom configuration, the updated context data is automatically saved as [message metadata](/messaging/message-metadata/) of the first reply from the app.
As long as you use the built-in approach, you don't need to store the context data within a datastore. The downside of this default behavior is the overhead of additional calls to the Slack API. These calls include those to `conversations.history`, which are used to look up the stored message metadata that contains the thread context (via `get_thread_context`).
@@ -256,14 +252,14 @@ assistant = Assistant(thread_context_store=FileAssistantThreadContextStore())
## Handling the user response {#handling-the-user-response}
-When the user messages your app, the [`message.im`](https://docs.slack.dev/reference/events/message.im) event will be sent to your app.
+When the user messages your app, the [`message.im`](/reference/events/message.im) event will be sent to your app.
-Messages sent to the app do not contain a [subtype](https://docs.slack.dev/reference/events/message#subtypes) and must be deduced based on their shape and any provided [message metadata](https://docs.slack.dev/messaging/message-metadata/).
+Messages sent to the app do not contain a [subtype](/reference/events/message#subtypes) and must be deduced based on their shape and any provided [message metadata](/messaging/message-metadata/).
There are three utilities that are particularly useful in curating the user experience:
-* [`say`](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/#slack_bolt.Say)
-* [`setTitle`](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/#slack_bolt.SetTitle)
-* [`setStatus`](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/#slack_bolt.SetStatus)
+* [`say`](https://docs.slack.dev/tools/bolt-python/reference/#slack_bolt.Say)
+* [`setTitle`](https://docs.slack.dev/tools/bolt-python/reference/#slack_bolt.SetTitle)
+* [`setStatus`](https://docs.slack.dev/tools/bolt-python/reference/#slack_bolt.SetStatus)
```python
...
diff --git a/docs/content/concepts/app-home.md b/docs/english/concepts/app-home.md
similarity index 52%
rename from docs/content/concepts/app-home.md
rename to docs/english/concepts/app-home.md
index d29bfc4d6..8b0e2cf11 100644
--- a/docs/content/concepts/app-home.md
+++ b/docs/english/concepts/app-home.md
@@ -1,14 +1,10 @@
----
-title: Publishing views to App Home
-lang: en
-slug: /concepts/app-home
----
+# Publishing views to App Home
-[Home tabs](https://docs.slack.dev/surfaces/app-home) are customizable surfaces accessible via the sidebar and search that allow apps to display views on a per-user basis. After enabling App Home within your app configuration, home tabs can be published and updated by passing a `user_id` and [view payload](https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission) to the [`views.publish`](https://docs.slack.dev/reference/methods/views.publis) method.
+[Home tabs](/surfaces/app-home) are customizable surfaces accessible via the sidebar and search that allow apps to display views on a per-user basis. After enabling App Home within your app configuration, home tabs can be published and updated by passing a `user_id` and [view payload](/reference/interaction-payloads/view-interactions-payload/#view_submission) to the [`views.publish`](/reference/methods/views.publish) method.
-You can subscribe to the [`app_home_opened`](https://docs.slack.dev/reference/events/app_home_opened) event to listen for when users open your App Home.
+You can subscribe to the [`app_home_opened`](/reference/events/app_home_opened) event to listen for when users open your App Home.
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn the available listener arguments.
+Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.
```python
@app.event("app_home_opened")
def update_home_tab(client, event, logger):
@@ -32,7 +28,7 @@ def update_home_tab(client, event, logger):
"type": "section",
"text": {
"type": "mrkdwn",
- "text": "Learn how home tabs can be more useful and interactive ."
+ "text": "Learn how home tabs can be more useful and interactive ."
}
}
]
diff --git a/docs/content/concepts/async.md b/docs/english/concepts/async.md
similarity index 97%
rename from docs/content/concepts/async.md
rename to docs/english/concepts/async.md
index 197377f93..e6ae28fc6 100644
--- a/docs/content/concepts/async.md
+++ b/docs/english/concepts/async.md
@@ -1,8 +1,4 @@
----
-title: Using async (asyncio)
-lang: en
-slug: /concepts/async
----
+# Using async (asyncio)
To use the async version of Bolt, you can import and initialize an `AsyncApp` instance (rather than `App`). `AsyncApp` relies on [AIOHTTP](https://docs.aiohttp.org) to make API requests, which means you'll need to install `aiohttp` (by adding to `requirements.txt` or running `pip install aiohttp`).
diff --git a/docs/content/concepts/authenticating-oauth.md b/docs/english/concepts/authenticating-oauth.md
similarity index 89%
rename from docs/content/concepts/authenticating-oauth.md
rename to docs/english/concepts/authenticating-oauth.md
index 1fabe3522..88b422949 100644
--- a/docs/content/concepts/authenticating-oauth.md
+++ b/docs/english/concepts/authenticating-oauth.md
@@ -1,18 +1,14 @@
----
-title: Authenticating with OAuth
-lang: en
-slug: /concepts/authenticating-oauth
----
+# Authenticating with OAuth
-Slack apps installed on multiple workspaces will need to implement OAuth, then store installation information (like access tokens) securely. By providing `client_id`, `client_secret`, `scopes`, `installation_store`, and `state_store` when initializing App, Bolt for Python will handle the work of setting up OAuth routes and verifying state. If you're implementing a custom adapter, you can make use of our [OAuth library](https://tools.slack.dev/python-slack-sdk/oauth/), which is what Bolt for Python uses under the hood.
+Slack apps installed on multiple workspaces will need to implement OAuth, then store installation information (like access tokens) securely. By providing `client_id`, `client_secret`, `scopes`, `installation_store`, and `state_store` when initializing App, Bolt for Python will handle the work of setting up OAuth routes and verifying state. If you're implementing a custom adapter, you can make use of our [OAuth library](/tools/python-slack-sdk/oauth/), which is what Bolt for Python uses under the hood.
Bolt for Python will create a **Redirect URL** `slack/oauth_redirect`, which Slack uses to redirect users after they complete your app's installation flow. You will need to add this **Redirect URL** in your app configuration settings under **OAuth and Permissions**. This path can be configured in the `OAuthSettings` argument described below.
Bolt for Python will also create a `slack/install` route, where you can find an **Add to Slack** button for your app to perform direct installs of your app. If you need any additional authorizations (user tokens) from users inside a team when your app is already installed or a reason to dynamically generate an install URL, you can pass your own custom URL generator to `oauth_settings` as `authorize_url_generator`.
-Bolt for Python automatically includes support for [org wide installations](https://docs.slack.dev/enterprise-grid/) in version `1.1.0+`. Org wide installations can be enabled in your app configuration settings under **Org Level Apps**.
+Bolt for Python automatically includes support for [org wide installations](/enterprise-grid/) in version `1.1.0+`. Org wide installations can be enabled in your app configuration settings under **Org Level Apps**.
-To learn more about the OAuth installation flow with Slack, [read the API documentation](https://docs.slack.dev/authentication/installing-with-oauth).
+To learn more about the OAuth installation flow with Slack, [read the API documentation](/authentication/installing-with-oauth).
```python
import os
diff --git a/docs/content/concepts/authorization.md b/docs/english/concepts/authorization.md
similarity index 94%
rename from docs/content/concepts/authorization.md
rename to docs/english/concepts/authorization.md
index 4c293b5c2..242a86b39 100644
--- a/docs/content/concepts/authorization.md
+++ b/docs/english/concepts/authorization.md
@@ -1,12 +1,8 @@
----
-title: Authorization
-lang: en
-slug: /concepts/authorization
----
+# Authorization
Authorization is the process of determining which Slack credentials should be available while processing an incoming Slack request.
-Apps installed on a single workspace can simply pass their bot token into the `App` constructor using the `token` parameter. However, if your app will be installed on multiple workspaces, you have two options. The easier option is to use the built-in OAuth support. This will handle setting up OAuth routes and verifying state. Read the section on [authenticating with OAuth](/concepts/authenticating-oauth) for details.
+Apps installed on a single workspace can simply pass their bot token into the `App` constructor using the `token` parameter. However, if your app will be installed on multiple workspaces, you have two options. The easier option is to use the built-in OAuth support. This will handle setting up OAuth routes and verifying state. Read the section on [authenticating with OAuth](/tools/bolt-python/concepts/authenticating-oauth) for details.
For a more custom solution, you can set the `authorize` parameter to a function upon `App` instantiation. The `authorize` function should return [an instance of `AuthorizeResult`](https://github.com/slackapi/bolt-python/blob/main/slack_bolt/authorization/authorize_result.py), which contains information about who and where the request is coming from.
diff --git a/docs/content/concepts/commands.md b/docs/english/concepts/commands.md
similarity index 74%
rename from docs/content/concepts/commands.md
rename to docs/english/concepts/commands.md
index 4c99f6628..81167fb83 100644
--- a/docs/content/concepts/commands.md
+++ b/docs/english/concepts/commands.md
@@ -1,18 +1,14 @@
----
-title: Listening & responding to commands
-lang: en
-slug: /concepts/commands
----
+# Listening & responding to commands
Your app can use the `command()` method to listen to incoming slash command requests. The method requires a `command_name` of type `str`.
Commands must be acknowledged with `ack()` to inform Slack your app has received the request.
-There are two ways to respond to slash commands. The first way is to use `say()`, which accepts a string or JSON payload. The second is `respond()` which is a utility for the `response_url`. These are explained in more depth in the [responding to actions](/concepts/actions) section.
+There are two ways to respond to slash commands. The first way is to use `say()`, which accepts a string or JSON payload. The second is `respond()` which is a utility for the `response_url`. These are explained in more depth in the [responding to actions](/tools/bolt-python/concepts/actions) section.
When setting up commands within your app configuration, you'll append `/slack/events` to your request URL.
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn the available listener arguments.
+Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.
```python
# The echo command simply echoes on command
@app.command("/echo")
diff --git a/docs/content/concepts/context.md b/docs/english/concepts/context.md
similarity index 96%
rename from docs/content/concepts/context.md
rename to docs/english/concepts/context.md
index cf7fa45f1..fb134c896 100644
--- a/docs/content/concepts/context.md
+++ b/docs/english/concepts/context.md
@@ -1,8 +1,4 @@
----
-title: Adding context
-lang: en
-slug: /concepts/context
----
+# Adding context
All listeners have access to a `context` dictionary, which can be used to enrich requests with additional information. Bolt automatically attaches information that is included in the incoming request, like `user_id`, `team_id`, `channel_id`, and `enterprise_id`.
diff --git a/docs/content/concepts/custom-adapters.md b/docs/english/concepts/custom-adapters.md
similarity index 92%
rename from docs/content/concepts/custom-adapters.md
rename to docs/english/concepts/custom-adapters.md
index 55c73130d..62532e7cd 100644
--- a/docs/content/concepts/custom-adapters.md
+++ b/docs/english/concepts/custom-adapters.md
@@ -1,10 +1,6 @@
----
-title: Custom adapters
-lang: en
-slug: /concepts/custom-adapters
----
+# Custom adapters
-[Adapters](/concepts/adapters) are flexible and can be adjusted based on the framework you prefer. There are two necessary components of adapters:
+[Adapters](/tools/bolt-python/concepts/adapters) are flexible and can be adjusted based on the framework you prefer. There are two necessary components of adapters:
- `__init__(app: App)`: Constructor that accepts and stores an instance of the Bolt `App`.
- `handle(req: Request)`: Function (typically named `handle()`) that receives incoming Slack requests, parses them to conform to an instance of [`BoltRequest`](https://github.com/slackapi/bolt-python/blob/main/slack_bolt/request/request.py), then dispatches them to the stored Bolt app.
diff --git a/docs/content/concepts/custom-steps-dynamic-options.md b/docs/english/concepts/custom-steps-dynamic-options.md
similarity index 75%
rename from docs/content/concepts/custom-steps-dynamic-options.md
rename to docs/english/concepts/custom-steps-dynamic-options.md
index cab3f7a61..9a152daa0 100644
--- a/docs/content/concepts/custom-steps-dynamic-options.md
+++ b/docs/english/concepts/custom-steps-dynamic-options.md
@@ -2,7 +2,7 @@
## Background {#background}
-[Legacy steps from apps](https://docs.slack.dev/changelog/2023-08-workflow-steps-from-apps-step-back) previously enabled Slack apps to create and process custom workflow steps, which could then be shared and used by anyone in Workflow Builder. To support your transition away from them, custom steps used as dynamic options are available. These allow you to use data defined when referencing the step in Workflow Builder as inputs to the step.
+[Legacy steps from apps](/changelog/2023-08-workflow-steps-from-apps-step-back) previously enabled Slack apps to create and process custom workflow steps, which could then be shared and used by anyone in Workflow Builder. To support your transition away from them, custom steps used as dynamic options are available. These allow you to use data defined when referencing the step in Workflow Builder as inputs to the step.
## Example use case {#use-case}
@@ -88,13 +88,13 @@ The `inputs` attribute defines the parameters to be passed as inputs to the step
The following format can be used to reference any input parameter defined by the step: `{{input_parameters.}}`.
-In addition, the `{{client.query}}` parameter can be used as a placeholder for an input value. The `{{client.builder_context}}` parameter will inject the [`slack#/types/user_context`](https://tools.slack.dev/deno-slack-sdk/reference/slack-types/#usercontext) of the user building the workflow as the value to the input parameter.
+In addition, the `{{client.query}}` parameter can be used as a placeholder for an input value. The `{{client.builder_context}}` parameter will inject the [`slack#/types/user_context`](/tools/deno-slack-sdk/reference/slack-types/#usercontext) of the user building the workflow as the value to the input parameter.
### Types of dynamic options UIs {#dynamic-option-UIs}
The above example demonstrates one possible UI to be rendered for builders: a single-select drop-down menu of dynamic options. However, dynamic options in Workflow Builder can be rendered in one of two ways: as a drop-down menu (single-select or multi-select), or as a set of fields.
-The type is dictated by the output parameter of the custom step used as a dynamic option. In order to use a custom step in a dynamic option context, its output must adhere to a defined interface, that is, it must have an `options` parameter of type [`options_select`](https://tools.slack.dev/deno-slack-sdk/reference/slack-types#options_select) or [`options_field`](https://tools.slack.dev/deno-slack-sdk/reference/slack-types#options_field), as shown in the following code snippet.
+The type is dictated by the output parameter of the custom step used as a dynamic option. In order to use a custom step in a dynamic option context, its output must adhere to a defined interface, that is, it must have an `options` parameter of type [`options_select`](/tools/deno-slack-sdk/reference/slack-types#options_select) or [`options_field`](/tools/deno-slack-sdk/reference/slack-types#options_field), as shown in the following code snippet.
```js
"output_parameters": {
@@ -109,9 +109,9 @@ The type is dictated by the output parameter of the custom step used as a dynami
#### Drop-down menus {#drop-down}
-Your dynamic input parameter can be rendered as a drop-down menu, which will use the options obtained from a custom step with an `options` output parameter of the type [`options_select`](https://tools.slack.dev/deno-slack-sdk/reference/slack-types#options_select).
+Your dynamic input parameter can be rendered as a drop-down menu, which will use the options obtained from a custom step with an `options` output parameter of the type [`options_select`](/tools/deno-slack-sdk/reference/slack-types#options_select).
-The drop-down menu UI component can be rendered in two ways: single-select, or multi-select. To render the dynamic input as a single-select menu, the input parameter defining the dynamic option must be of the type [`string`](https://tools.slack.dev/deno-slack-sdk/reference/slack-types#string).
+The drop-down menu UI component can be rendered in two ways: single-select, or multi-select. To render the dynamic input as a single-select menu, the input parameter defining the dynamic option must be of the type [`string`](/tools/deno-slack-sdk/reference/slack-types#string).
```js
"step-with-dynamic-input": {
@@ -133,7 +133,7 @@ The drop-down menu UI component can be rendered in two ways: single-select, or m
}
```
-To render the dynamic input as a multi-select menu, the input parameter defining the dynamic option must be of the type [`array`](https://tools.slack.dev/deno-slack-sdk/reference/slack-types#array), and its `items` must be of type [`string`](https://tools.slack.dev/deno-slack-sdk/reference/slack-types#string).
+To render the dynamic input as a multi-select menu, the input parameter defining the dynamic option must be of the type [`array`](/tools/deno-slack-sdk/reference/slack-types#array), and its `items` must be of type [`string`](/tools/deno-slack-sdk/reference/slack-types#string).
```js
"step-with-dynamic-input": {
@@ -159,9 +159,9 @@ To render the dynamic input as a multi-select menu, the input parameter defining
#### Fields {#fields}
-In the code snippet below, the input parameter is rendered as a set of fields with keys and values. The option fields are obtained from a custom step with an `options` output parameter of type [`options_field`](https://tools.slack.dev/deno-slack-sdk/reference/slack-types#options_field).
+In the code snippet below, the input parameter is rendered as a set of fields with keys and values. The option fields are obtained from a custom step with an `options` output parameter of type [`options_field`](/tools/deno-slack-sdk/reference/slack-types#options_field).
-The input parameter that defines the dynamic option must be of type [`object`](https://tools.slack.dev/deno-slack-sdk/reference/slack-types#object), as the completed set of fields in Workflow Builder will be passed to the custom step as an [untyped object](https://tools.slack.dev/deno-slack-sdk/reference/slack-types#untyped-object) during workflow execution.
+The input parameter that defines the dynamic option must be of type [`object`](/tools/deno-slack-sdk/reference/slack-types#object), as the completed set of fields in Workflow Builder will be passed to the custom step as an [untyped object](/tools/deno-slack-sdk/reference/slack-types#untyped-object) during workflow execution.
```js
"test-field-dynamic-options": {
@@ -185,20 +185,20 @@ The input parameter that defines the dynamic option must be of type [`object`](h
### Dynamic option types {#dynamic-option-types}
-As mentioned earlier, in order to use a custom step as a dynamic option, its output must adhere to a defined interface: it must have an `options` output parameter of the type either [`options_select`](https://tools.slack.dev/deno-slack-sdk/reference/slack-types#options_select) or [`options_field`](https://tools.slack.dev/deno-slack-sdk/reference/slack-types#options_field).
+As mentioned earlier, in order to use a custom step as a dynamic option, its output must adhere to a defined interface: it must have an `options` output parameter of the type either [`options_select`](/tools/deno-slack-sdk/reference/slack-types#options_select) or [`options_field`](/tools/deno-slack-sdk/reference/slack-types#options_field).
-To take a look at these in more detail, refer to our [Options Slack type](https://tools.slack.dev/deno-slack-sdk/reference/slack-types#options) documentation.
+To take a look at these in more detail, refer to our [Options Slack type](/tools/deno-slack-sdk/reference/slack-types#options) documentation.
## Dynamic options handler {#dynamic-option-handler}
Each custom step defined in the manifest needs a corresponding handler in your Slack app. Although implemented similarly to existing function execution event handlers, there are two key differences between regular custom step invocations and those used for dynamic options:
-* The custom step must have an `options` output parameter that is of type [`options_select`](https://tools.slack.dev/deno-slack-sdk/reference/slack-types#options_select) or [`options_field`](https://tools.slack.dev/deno-slack-sdk/reference/slack-types#options_field).
-* The [`function_executed`](https://docs.slack.dev/reference/events/function_executed) event must be handled synchronously. This optimizes the response time of returned dynamic options and provides a crisp builder experience.
+* The custom step must have an `options` output parameter that is of type [`options_select`](/tools/deno-slack-sdk/reference/slack-types#options_select) or [`options_field`](/tools/deno-slack-sdk/reference/slack-types#options_field).
+* The [`function_executed`](/reference/events/function_executed) event must be handled synchronously. This optimizes the response time of returned dynamic options and provides a crisp builder experience.
### Asynchronous event handling {#async}
-By default, the [Bolt family of frameworks](https://tools.slack.dev/) handles `function_executed` events asynchronously.
+By default, the Bolt family of frameworks handles `function_executed` events asynchronously.
For example, the various modal-related API methods provide two ways to update a view: synchronously using a `response_action` HTTP response, or asynchronously using a separate HTTP API call. Using the asynchronous approach allows developers to handle events free of timeouts, but this isn't desired for dynamic options as it introduces delays and violates our stated goal of providing a crisp builder experience.
@@ -208,13 +208,13 @@ Dynamic options support synchronous handling of `function_executed` events. By e
### Implementation {#implementation}
-To optimize the response time of dynamic options, you must acknowledge the incoming event after calling the [`function.completeSuccess`](https://docs.slack.dev/reference/methods/functions.completeSuccess) or [`function.completeError`](https://docs.slack.dev/reference/methods/functions.completeError) API methods, minimizing asynchronous latency. The `function.completeSuccess` and `function.completeError` API methods are invoked in the complete and fail helper functions. ([For example](https://github.com/slackapi/bolt-python?tab=readme-ov-file#making-things-happen)).
+To optimize the response time of dynamic options, you must acknowledge the incoming event after calling the [`function.completeSuccess`](/reference/methods/functions.completeSuccess) or [`function.completeError`](/reference/methods/functions.completeError) API methods, minimizing asynchronous latency. The `function.completeSuccess` and `function.completeError` API methods are invoked in the complete and fail helper functions. ([For example](https://github.com/slackapi/bolt-python?tab=readme-ov-file#making-things-happen)).
A new `auto_acknowledge` flag allows you more granular control over whether specific event handlers should operate in synchronous or asynchronous response modes in order to enable a smooth dynamic options experience.
#### Example {#bolt-py}
-In [Bolt for Python](https://tools.slack.dev/bolt-python/), you can set `auto_acknowledge=False` on a specific function decorator. This allows you to manually control when the `ack()` event acknowledgement helper function is executed. It flips Bolt to synchronous `function_executed` event handling mode for the specific handler.
+In [Bolt for Python](https://docs.slack.dev/tools/bolt-python/), you can set `auto_acknowledge=False` on a specific function decorator. This allows you to manually control when the `ack()` event acknowledgement helper function is executed. It flips Bolt to synchronous `function_executed` event handling mode for the specific handler.
```py
@app.function("get-projects", auto_acknowledge=False)
@@ -244,4 +244,4 @@ def handle_get_projects(ack: Ack, complete: Complete):
ack()
```
-✨ **To learn more about the Bolt family of frameworks and tools**, check out our [Slack Developer Tools](https://tools.slack.dev/).
+✨ **To learn more about the Bolt family of frameworks and tools**, check out our [Slack Developer Tools](/tools).
diff --git a/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/concepts/custom-steps.md b/docs/english/concepts/custom-steps.md
similarity index 86%
rename from docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/concepts/custom-steps.md
rename to docs/english/concepts/custom-steps.md
index e022c3e38..720c53421 100644
--- a/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/concepts/custom-steps.md
+++ b/docs/english/concepts/custom-steps.md
@@ -1,17 +1,17 @@
---
-title: Listening and responding to custom steps
-lang: ja-jp
-slug: /concepts/custom-steps
+sidebar_label: Custom steps
---
-Your app can use the `function()` method to listen to incoming [custom step requests](https://docs.slack.dev/workflows/workflow-steps). Custom steps are used in Workflow Builder to build workflows. The method requires a step `callback_id` of type `str`. This `callback_id` must also be defined in your [Function](https://docs.slack.dev/reference/app-manifest#functions) definition. Custom steps must be finalized using the `complete()` or `fail()` listener arguments to notify Slack that your app has processed the request.
+# Listening and responding to custom steps
+
+Your app can use the `function()` method to listen to incoming [custom step requests](/workflows/workflow-steps). Custom steps are used in Workflow Builder to build workflows. The method requires a step `callback_id` of type `str`. This `callback_id` must also be defined in your [Function](/reference/app-manifest#functions) definition. Custom steps must be finalized using the `complete()` or `fail()` listener arguments to notify Slack that your app has processed the request.
* `complete()` requires **one** argument: `outputs` of type `dict`. It ends your custom step **successfully** and provides a dictionary containing the outputs of your custom step as per its definition.
* `fail()` requires **one** argument: `error` of type `str`. It ends your custom step **unsuccessfully** and provides a message containing information regarding why your custom step failed.
You can reference your custom step's inputs using the `inputs` listener argument of type `dict`.
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn about the available listener arguments.
+Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn about the available listener arguments.
```python
# This sample custom step formats an input and outputs it
@@ -68,13 +68,13 @@ Example app manifest definition
Your app's custom steps may create interactivity points for users, for example: Post a message with a button.
-If such interaction points originate from a custom step execution, the events sent to your app representing the end-user interaction with these points are considered to be _function-scoped interactivity events_. These interactivity events can be handled by your app using the same concepts we covered earlier, such as [Listening to actions](/concepts/action-listening).
+If such interaction points originate from a custom step execution, the events sent to your app representing the end-user interaction with these points are considered to be _function-scoped interactivity events_. These interactivity events can be handled by your app using the same concepts we covered earlier, such as [Listening to actions](/tools/bolt-python/concepts/actions).
_function-scoped interactivity events_ will contain data related to the custom step (`function_executed` event) they were spawned from, such as custom step `inputs` and access to `complete()` and `fail()` listener arguments.
Your app can skip calling `complete()` or `fail()` in the `function()` handler method if the custom step creates an interaction point that requires user interaction before the step can end. However, in the relevant interactivity handler method, your app must invoke `complete()` or `fail()` to notify Slack that the custom step has been processed.
-You’ll notice in all interactivity handler examples, `ack()` is used. It is required to call the `ack()` function within an interactivity listener to acknowledge that the request was received from Slack. This is discussed in the [acknowledging requests section](/concepts/acknowledge).
+You’ll notice in all interactivity handler examples, `ack()` is used. It is required to call the `ack()` function within an interactivity listener to acknowledge that the request was received from Slack. This is discussed in the [acknowledging requests section](/tools/bolt-python/concepts/acknowledge).
```python
# This sample custom step posts a message with a button
@@ -150,4 +150,4 @@ Example app manifest definition
-Learn more about responding to interactivity, see the [Slack API documentation](https://docs.slack.dev/interactivity/).
+Learn more about responding to interactivity, see the [Slack API documentation](/interactivity/handling-user-interaction).
diff --git a/docs/content/concepts/errors.md b/docs/english/concepts/errors.md
similarity index 90%
rename from docs/content/concepts/errors.md
rename to docs/english/concepts/errors.md
index d0e5cccad..ed41c5816 100644
--- a/docs/content/concepts/errors.md
+++ b/docs/english/concepts/errors.md
@@ -1,8 +1,4 @@
----
-title: Handling errors
-lang: en
-slug: /concepts/errors
----
+# Handling errors
If an error occurs in a listener, you can handle it directly using a try/except block. Errors associated with your app will be of type `BoltError`. Errors associated with calling Slack APIs will be of type `SlackApiError`.
diff --git a/docs/content/concepts/event-listening.md b/docs/english/concepts/event-listening.md
similarity index 60%
rename from docs/content/concepts/event-listening.md
rename to docs/english/concepts/event-listening.md
index 7ffa9e3a2..d7b8e5930 100644
--- a/docs/content/concepts/event-listening.md
+++ b/docs/english/concepts/event-listening.md
@@ -1,14 +1,10 @@
----
-title: Listening to events
-lang: en
-slug: /concepts/event-listening
----
+# Listening to events
-You can listen to [any Events API event](https://docs.slack.dev/reference/events) using the `event()` method after subscribing to it in your app configuration. This allows your app to take action when something happens in a workspace where it's installed, like a user reacting to a message or joining a channel.
+You can listen to [any Events API event](/reference/events) using the `event()` method after subscribing to it in your app configuration. This allows your app to take action when something happens in a workspace where it's installed, like a user reacting to a message or joining a channel.
The `event()` method requires an `eventType` of type `str`.
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn the available listener arguments.
+Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.
```python
# When a user joins the workspace, send a message in a predefined channel asking them to introduce themselves
@app.event("team_join")
@@ -23,7 +19,7 @@ def ask_for_introduction(event, say):
The `message()` listener is equivalent to `event("message")`.
-You can filter on subtypes of events by passing in the additional key `subtype`. Common message subtypes like `bot_message` and `message_replied` can be found [on the message event page](https://docs.slack.dev/reference/events/message#subtypes).
+You can filter on subtypes of events by passing in the additional key `subtype`. Common message subtypes like `bot_message` and `message_replied` can be found [on the message event page](/reference/events/message#subtypes).
You can explicitly filter for events without a subtype by explicitly setting `None`.
```python
diff --git a/docs/content/concepts/global-middleware.md b/docs/english/concepts/global-middleware.md
similarity index 82%
rename from docs/content/concepts/global-middleware.md
rename to docs/english/concepts/global-middleware.md
index ec748c000..dbcdeae99 100644
--- a/docs/content/concepts/global-middleware.md
+++ b/docs/english/concepts/global-middleware.md
@@ -1,14 +1,10 @@
----
-title: Global middleware
-lang: en
-slug: /concepts/global-middleware
----
+# Global middleware
Global middleware is run for all incoming requests, before any listener middleware. You can add any number of global middleware to your app by passing middleware functions to `app.use()`. Middleware functions are called with the same arguments as listeners, with an additional `next()` function.
Both global and listener middleware must call `next()` to pass control of the execution chain to the next middleware.
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn the available listener arguments.
+Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.
```python
@app.use
def auth_acme(client, context, logger, payload, next):
diff --git a/docs/content/concepts/lazy-listeners.md b/docs/english/concepts/lazy-listeners.md
similarity index 98%
rename from docs/content/concepts/lazy-listeners.md
rename to docs/english/concepts/lazy-listeners.md
index d72c2f9c0..d775106b9 100644
--- a/docs/content/concepts/lazy-listeners.md
+++ b/docs/english/concepts/lazy-listeners.md
@@ -1,8 +1,4 @@
----
-title: Lazy listeners (FaaS)
-lang: en
-slug: /concepts/lazy-listeners
----
+# Lazy listeners (FaaS)
Lazy Listeners are a feature which make it easier to deploy Slack apps to FaaS (Function-as-a-Service) environments. Please note that this feature is only available in Bolt for Python, and we are not planning to add the same to other Bolt frameworks.
diff --git a/docs/content/concepts/listener-middleware.md b/docs/english/concepts/listener-middleware.md
similarity index 83%
rename from docs/content/concepts/listener-middleware.md
rename to docs/english/concepts/listener-middleware.md
index 3507d7d97..c8bfc964e 100644
--- a/docs/content/concepts/listener-middleware.md
+++ b/docs/english/concepts/listener-middleware.md
@@ -1,14 +1,10 @@
----
-title: Listener middleware
-lang: en
-slug: /concepts/listener-middleware
----
+# Listener middleware
Listener middleware is only run for the listener in which it's passed. You can pass any number of middleware functions to the listener using the `middleware` parameter, which must be a list that contains one to many middleware functions.
If your listener middleware is a quite simple one, you can use a listener matcher, which returns `bool` value (`True` for proceeding) instead of requiring `next()` method call.
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn the available listener arguments.
+Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.
```python
# Listener middleware which filters out messages from a bot
diff --git a/docs/content/concepts/logging.md b/docs/english/concepts/logging.md
similarity index 94%
rename from docs/content/concepts/logging.md
rename to docs/english/concepts/logging.md
index 5f82d168a..49e275d2d 100644
--- a/docs/content/concepts/logging.md
+++ b/docs/english/concepts/logging.md
@@ -1,8 +1,4 @@
----
-title: Logging
-lang: en
-slug: /concepts/logging
----
+# Logging
By default, Bolt will log information from your app to the output destination. After you've imported the `logging` module, you can customize the root log level by passing the `level` parameter to `basicConfig()`. The available log levels in order of least to most severe are `debug`, `info`, `warning`, `error`, and `critical`.
diff --git a/docs/content/concepts/message-listening.md b/docs/english/concepts/message-listening.md
similarity index 59%
rename from docs/content/concepts/message-listening.md
rename to docs/english/concepts/message-listening.md
index b2f8bc05c..be6e74678 100644
--- a/docs/content/concepts/message-listening.md
+++ b/docs/english/concepts/message-listening.md
@@ -1,16 +1,9 @@
----
-title: Listening to messages
-lang: en
-slug: /concepts/message-listening
----
-
-To listen to messages that [your app has access to receive](https://docs.slack.dev/messaging/retrieving-messages), you can use the `message()` method which filters out events that aren't of type `message`.
+# Listening to messages
+To listen to messages that [your app has access to receive](/messaging/retrieving-messages), you can use the `message()` method which filters out events that aren't of type `message`.
`message()` accepts an argument of type `str` or `re.Pattern` object that filters out any messages that don't match the pattern.
-:::info
-
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn the available listener arguments.
+:::info[Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.]
:::
diff --git a/docs/content/concepts/message-sending.md b/docs/english/concepts/message-sending.md
similarity index 77%
rename from docs/content/concepts/message-sending.md
rename to docs/english/concepts/message-sending.md
index b4a2f309e..228a7b6b8 100644
--- a/docs/content/concepts/message-sending.md
+++ b/docs/english/concepts/message-sending.md
@@ -1,14 +1,10 @@
----
-title: Sending messages
-lang: en
-slug: /concepts/message-sending
----
+# Sending messages
Within your listener function, `say()` is available whenever there is an associated conversation (for example, a conversation where the event or action which triggered the listener occurred). `say()` accepts a string to post simple messages and JSON payloads to send more complex messages. The message payload you pass in will be sent to the associated conversation.
-In the case that you'd like to send a message outside of a listener or you want to do something more advanced (like handle specific errors), you can call `client.chat_postMessage` [using the client attached to your Bolt instance](/concepts/web-api).
+In the case that you'd like to send a message outside of a listener or you want to do something more advanced (like handle specific errors), you can call `client.chat_postMessage` [using the client attached to your Bolt instance](/tools/bolt-python/concepts/web-api).
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn the available listener arguments.
+Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.
```python
# Listens for messages containing "knock knock" and responds with an italicized "who's there?"
@app.message("knock knock")
@@ -20,7 +16,7 @@ def ask_who(message, say):
`say()` accepts more complex message payloads to make it easy to add functionality and structure to your messages.
-To explore adding rich message layouts to your app, read through [the guide on our API site](https://docs.slack.dev/messaging/#structure) and look through templates of common app flows [in the Block Kit Builder](https://api.slack.com/tools/block-kit-builder?template=1).
+To explore adding rich message layouts to your app, read through [the guide on our API site](/messaging/#structure) and look through templates of common app flows [in the Block Kit Builder](https://api.slack.com/tools/block-kit-builder?template=1).
```python
# Sends a section block with datepicker when someone reacts with a 📅 emoji
diff --git a/docs/content/concepts/opening-modals.md b/docs/english/concepts/opening-modals.md
similarity index 68%
rename from docs/content/concepts/opening-modals.md
rename to docs/english/concepts/opening-modals.md
index e7daceafc..1f053539f 100644
--- a/docs/content/concepts/opening-modals.md
+++ b/docs/english/concepts/opening-modals.md
@@ -1,16 +1,12 @@
----
-title: Opening modals
-lang: en
-slug: /concepts/opening-modals
----
+# Opening modals
-[Modals](https://docs.slack.dev/surfaces/modals) are focused surfaces that allow you to collect user data and display dynamic information. You can open a modal by passing a valid `trigger_id` and a [view payload](https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission) to the built-in client's [`views.open`](https://docs.slack.dev/reference/methods/views.open/) method.
+[Modals](/surfaces/modals) are focused surfaces that allow you to collect user data and display dynamic information. You can open a modal by passing a valid `trigger_id` and a [view payload](/reference/interaction-payloads/view-interactions-payload/#view_submission) to the built-in client's [`views.open`](/reference/methods/views.open/) method.
Your app receives `trigger_id` parameters in payloads sent to your Request URL triggered user invocation like a slash command, button press, or interaction with a select menu.
-Read more about modal composition in the [API documentation](https://docs.slack.dev/surfaces/modals#composing_views).
+Read more about modal composition in the [API documentation](/surfaces/modals#composing_views).
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn the available listener arguments.
+Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.
```python
# Listen for a shortcut invocation
diff --git a/docs/content/concepts/select-menu-options.md b/docs/english/concepts/select-menu-options.md
similarity index 67%
rename from docs/content/concepts/select-menu-options.md
rename to docs/english/concepts/select-menu-options.md
index d699e6370..40d29472c 100644
--- a/docs/content/concepts/select-menu-options.md
+++ b/docs/english/concepts/select-menu-options.md
@@ -1,19 +1,15 @@
----
-title: Listening & responding to select menu options
-lang: en
-slug: /concepts/options
----
+# Listening & responding to select menu options
-The `options()` method listens for incoming option request payloads from Slack. [Similar to `action()`](/concepts/action-listening),
+The `options()` method listens for incoming option request payloads from Slack. [Similar to `action()`](/tools/bolt-python/concepts/actions),
an `action_id` or constraints object is required. In order to load external data into your select menus, you must provide an options load URL in your app configuration, appended with `/slack/events`.
While it's recommended to use `action_id` for `external_select` menus, dialogs do not support Block Kit so you'll have to use the constraints object to filter on a `callback_id`.
-To respond to options requests, you'll need to call `ack()` with a valid `options` or `option_groups` list. Both [external select response examples](https://docs.slack.dev/reference/block-kit/block-elements/multi-select-menu-element#external_multi_select) and [dialog response examples](https://docs.slack.dev/reference/block-kit/block-elements/multi-select-menu-element#conversation_multi_select) can be found on our API site.
+To respond to options requests, you'll need to call `ack()` with a valid `options` or `option_groups` list. Both [external select response examples](/reference/block-kit/block-elements/multi-select-menu-element#external_multi_select) and [dialog response examples](/reference/block-kit/block-elements/multi-select-menu-element#conversation_multi_select) can be found on our API site.
-Additionally, you may want to apply filtering logic to the returned options based on user input. This can be accomplished by using the `payload` argument to your options listener and checking for the contents of the `value` property within it. Based on the `value` you can return different options. All listeners and middleware handlers in Bolt for Python have access to [many useful arguments](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) - be sure to check them out!
+Additionally, you may want to apply filtering logic to the returned options based on user input. This can be accomplished by using the `payload` argument to your options listener and checking for the contents of the `value` property within it. Based on the `value` you can return different options. All listeners and middleware handlers in Bolt for Python have access to [many useful arguments](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) - be sure to check them out!
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn the available listener arguments.
+Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.
```python
# Example of responding to an external_select options request
@app.options("external_action")
diff --git a/docs/content/concepts/shortcuts.md b/docs/english/concepts/shortcuts.md
similarity index 74%
rename from docs/content/concepts/shortcuts.md
rename to docs/english/concepts/shortcuts.md
index 6833d468d..b28f0b352 100644
--- a/docs/content/concepts/shortcuts.md
+++ b/docs/english/concepts/shortcuts.md
@@ -1,22 +1,18 @@
----
-title: Listening & responding to shortcuts
-lang: en
-slug: /concepts/shortcuts
----
+# Listening & responding to shortcuts
-The `shortcut()` method supports both [global shortcuts](https://docs.slack.dev/interactivity/implementing-shortcuts#global) and [message shortcuts](https://docs.slack.dev/interactivity/implementing-shortcuts#messages).
+The `shortcut()` method supports both [global shortcuts](/interactivity/implementing-shortcuts#global) and [message shortcuts](/interactivity/implementing-shortcuts#messages).
Shortcuts are invokable entry points to apps. Global shortcuts are available from within search and text composer area in Slack. Message shortcuts are available in the context menus of messages. Your app can use the `shortcut()` method to listen to incoming shortcut requests. The method requires a `callback_id` parameter of type `str` or `re.Pattern`.
Shortcuts must be acknowledged with `ack()` to inform Slack that your app has received the request.
-Shortcuts include a `trigger_id` which an app can use to [open a modal](/concepts/opening-modals) that confirms the action the user is taking.
+Shortcuts include a `trigger_id` which an app can use to [open a modal](/tools/bolt-python/concepts/opening-modals) that confirms the action the user is taking.
When setting up shortcuts within your app configuration, as with other URLs, you'll append `/slack/events` to your request URL.
-⚠️ Note that global shortcuts do **not** include a channel ID. If your app needs access to a channel ID, you may use a [`conversations_select`](https://docs.slack.dev/reference/block-kit/block-elements/multi-select-menu-element#conversation_multi_select) element within a modal. Message shortcuts do include a channel ID.
+⚠️ Note that global shortcuts do **not** include a channel ID. If your app needs access to a channel ID, you may use a [`conversations_select`](/reference/block-kit/block-elements/multi-select-menu-element#conversation_multi_select) element within a modal. Message shortcuts do include a channel ID.
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn the available listener arguments.
+Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.
```python
# The open_modal shortcut listens to a shortcut with the callback_id "open_modal"
@app.shortcut("open_modal")
@@ -36,7 +32,7 @@ def open_modal(ack, shortcut, client):
"type": "section",
"text": {
"type": "mrkdwn",
- "text": "About the simplest modal you could conceive of :smile:\n\nMaybe or ."
+ "text": "About the simplest modal you could conceive of :smile:\n\nMaybe or ."
}
},
{
@@ -75,7 +71,7 @@ def open_modal(ack, shortcut, client):
"type": "section",
"text": {
"type": "mrkdwn",
- "text": "About the simplest modal you could conceive of :smile:\n\nMaybe or ."
+ "text": "About the simplest modal you could conceive of :smile:\n\nMaybe or ."
}
},
{
diff --git a/docs/content/concepts/socket-mode.md b/docs/english/concepts/socket-mode.md
similarity index 78%
rename from docs/content/concepts/socket-mode.md
rename to docs/english/concepts/socket-mode.md
index 301fbf94e..5156f6e13 100644
--- a/docs/content/concepts/socket-mode.md
+++ b/docs/english/concepts/socket-mode.md
@@ -1,10 +1,6 @@
----
-title: Using Socket Mode
-lang: en
-slug: /concepts/socket-mode
----
+# Using Socket Mode
-With the introduction of [Socket Mode](https://docs.slack.dev/apis/events-api/using-socket-mode), Bolt for Python introduced support in version `1.2.0`. With Socket Mode, instead of creating a server with endpoints that Slack sends payloads too, the app will instead connect to Slack via a WebSocket connection and receive data from Slack over the socket connection. Make sure to enable Socket Mode in your app configuration settings.
+With the introduction of [Socket Mode](/apis/events-api/using-socket-mode), Bolt for Python introduced support in version `1.2.0`. With Socket Mode, instead of creating a server with endpoints that Slack sends payloads too, the app will instead connect to Slack via a WebSocket connection and receive data from Slack over the socket connection. Make sure to enable Socket Mode in your app configuration settings.
To use the Socket Mode, add `SLACK_APP_TOKEN` as an environment variable. You can get your App Token in your app configuration settings under the **Basic Information** section.
@@ -38,7 +34,7 @@ if __name__ == "__main__":
To use the asyncio-based adapters such as aiohttp, your whole app needs to be compatible with asyncio's async/await programming model. `AsyncSocketModeHandler` is available for running `AsyncApp` and its async middleware and listeners.
-To learn how to use `AsyncApp`, checkout the [using Async](/concepts/async) document and relevant [examples](https://github.com/slackapi/bolt-python/tree/main/examples).
+To learn how to use `AsyncApp`, checkout the [using Async](/tools/bolt-python/concepts/async) document and relevant [examples](https://github.com/slackapi/bolt-python/tree/main/examples).
```python
from slack_bolt.app.async_app import AsyncApp
diff --git a/docs/content/concepts/token-rotation.md b/docs/english/concepts/token-rotation.md
similarity index 73%
rename from docs/content/concepts/token-rotation.md
rename to docs/english/concepts/token-rotation.md
index 88af29ffa..96a41bb3c 100644
--- a/docs/content/concepts/token-rotation.md
+++ b/docs/english/concepts/token-rotation.md
@@ -1,13 +1,9 @@
----
-title: Token rotation
-lang: en
-slug: /concepts/token-rotation
----
+# Token rotation
Supported in Bolt for Python as of [v1.7.0](https://github.com/slackapi/bolt-python/releases/tag/v1.7.0), token rotation provides an extra layer of security for your access tokens and is defined by the [OAuth V2 RFC](https://datatracker.ietf.org/doc/html/rfc6749#section-10.4).
Instead of an access token representing an existing installation of your Slack app indefinitely, with token rotation enabled, access tokens expire. A refresh token acts as a long-lived way to refresh your access tokens.
-Bolt for Python supports and will handle token rotation automatically so long as the [built-in OAuth](/concepts/authenticating-oauth) functionality is used.
+Bolt for Python supports and will handle token rotation automatically so long as the [built-in OAuth](/tools/bolt-python/concepts/authenticating-oauth) functionality is used.
-For more information about token rotation, please see the [documentation](https://docs.slack.dev/authentication/using-token-rotation).
\ No newline at end of file
+For more information about token rotation, please see the [documentation](/authentication/using-token-rotation).
\ No newline at end of file
diff --git a/docs/content/concepts/updating-pushing-views.md b/docs/english/concepts/updating-pushing-views.md
similarity index 64%
rename from docs/content/concepts/updating-pushing-views.md
rename to docs/english/concepts/updating-pushing-views.md
index aa1efa3fa..8c05e79c8 100644
--- a/docs/content/concepts/updating-pushing-views.md
+++ b/docs/english/concepts/updating-pushing-views.md
@@ -1,10 +1,6 @@
----
-title: Updating & pushing views
-lang: en
-slug: /concepts/updating-pushing-views
----
+# Updating & pushing views
-Modals contain a stack of views. When you call [`views_open`](https://api.https://docs.slack.dev/reference/methods/views.open/slack.com/methods/views.open), you add the root view to the modal. After the initial call, you can dynamically update a view by calling [`views_update`](https://docs.slack.dev/reference/methods/views.update/), or stack a new view on top of the root view by calling [`views_push`](https://docs.slack.dev/reference/methods/views.push/)
+Modals contain a stack of views. When you call [`views_open`](https://api./reference/methods/views.open/slack.com/methods/views.open), you add the root view to the modal. After the initial call, you can dynamically update a view by calling [`views_update`](/reference/methods/views.update/), or stack a new view on top of the root view by calling [`views_push`](/reference/methods/views.push/)
## The `views_update` method
@@ -12,11 +8,11 @@ To update a view, you can use the built-in client to call `views_update` with th
## The `views_push` method
-To push a new view onto the view stack, you can use the built-in client to call `views_push` with a valid `trigger_id` a new [view payload](https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission). The arguments for `views_push` is the same as [opening modals](/concepts/creating-models). After you open a modal, you may only push two additional views onto the view stack.
+To push a new view onto the view stack, you can use the built-in client to call `views_push` with a valid `trigger_id` a new [view payload](/reference/interaction-payloads/view-interactions-payload/#view_submission). The arguments for `views_push` is the same as [opening modals](/tools/bolt-python/concepts/opening-modals). After you open a modal, you may only push two additional views onto the view stack.
-Learn more about updating and pushing views in our [API documentation](https://docs.slack.dev/surfaces/modals)
+Learn more about updating and pushing views in our [API documentation](/surfaces/modals)
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn the available listener arguments.
+Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.
```python
# Listen for a button invocation with action_id `button_abc` (assume it's inside of a modal)
@app.action("button_abc")
diff --git a/docs/content/concepts/view-submissions.md b/docs/english/concepts/view-submissions.md
similarity index 74%
rename from docs/content/concepts/view-submissions.md
rename to docs/english/concepts/view-submissions.md
index 60b78cd54..4ff4c2da7 100644
--- a/docs/content/concepts/view-submissions.md
+++ b/docs/english/concepts/view-submissions.md
@@ -1,10 +1,6 @@
----
-title: Listening to views
-lang: en
-slug: /concepts/view_submissions
----
+# Listening to views
-If a [view payload](https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission) contains any input blocks, you must listen to `view_submission` requests to receive their values. To listen to `view_submission` requests, you can use the built-in `view()` method. `view()` requires a `callback_id` of type `str` or `re.Pattern`.
+If a [view payload](/reference/interaction-payloads/view-interactions-payload/#view_submission) contains any input blocks, you must listen to `view_submission` requests to receive their values. To listen to `view_submission` requests, you can use the built-in `view()` method. `view()` requires a `callback_id` of type `str` or `re.Pattern`.
You can access the value of the `input` blocks by accessing the `state` object. `state` contains a `values` object that uses the `block_id` and unique `action_id` to store the input values.
@@ -23,9 +19,9 @@ def handle_submission(ack, body):
# https://app.slack.com/block-kit-builder/#%7B%22type%22:%22modal%22,%22callback_id%22:%22view_1%22,%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22My%20App%22,%22emoji%22:true%7D,%22blocks%22:%5B%5D%7D
ack(response_action="update", view=build_new_view(body))
```
-Similarly, there are options for [displaying errors](https://docs.slack.dev/surfaces/modals#displaying_errors) in response to view submissions.
+Similarly, there are options for [displaying errors](/surfaces/modals#displaying_errors) in response to view submissions.
-Read more about view submissions in our [API documentation](https://docs.slack.dev/surfaces/modals#interactions)
+Read more about view submissions in our [API documentation](/surfaces/modals#interactions)
---
@@ -33,7 +29,7 @@ Read more about view submissions in our [API documentation](https://docs.slack.d
When listening for `view_closed` requests, you must pass `callback_id` and add a `notify_on_close` property to the view during creation. See below for an example of this:
-See the [API documentation](https://docs.slack.dev/surfaces/modals#interactions) for more information about `view_closed`.
+See the [API documentation](/surfaces/modals#interactions) for more information about `view_closed`.
```python
@@ -62,7 +58,7 @@ def handle_view_closed(ack, body, logger):
logger.info(body)
```
-Refer to [the module document](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) to learn the available listener arguments.
+Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.
```python
# Handle a view_submission request
@app.view("view_1")
diff --git a/docs/english/concepts/web-api.md b/docs/english/concepts/web-api.md
new file mode 100644
index 000000000..9cf436851
--- /dev/null
+++ b/docs/english/concepts/web-api.md
@@ -0,0 +1,22 @@
+# Using the Web API
+
+You can call [any Web API method](/reference/methods) using the `WebClient` provided to your Bolt app as either `app.client` or `client` in middleware/listener arguments (given that your app has the appropriate scopes). When you call one the client's methods, it returns a `SlackResponse` which contains the response from Slack.
+
+The token used to initialize Bolt can be found in the `context` object, which is required to call most Web API methods.
+
+:::info[Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.]
+
+:::
+
+```python
+@app.message("wake me up")
+def say_hello(client, message):
+ # Unix Epoch time for September 30, 2020 11:59:59 PM
+ when_september_ends = 1601510399
+ channel_id = message["channel"]
+ client.chat_scheduleMessage(
+ channel=channel_id,
+ post_at=when_september_ends,
+ text="Summer has come and passed"
+ )
+```
diff --git a/docs/content/getting-started.md b/docs/english/getting-started.md
similarity index 80%
rename from docs/content/getting-started.md
rename to docs/english/getting-started.md
index a794f3176..ebdf47189 100644
--- a/docs/content/getting-started.md
+++ b/docs/english/getting-started.md
@@ -1,9 +1,8 @@
---
-title: Quickstart guide with Bolt for Python
sidebar_label: Quickstart
---
-# Getting started with Bolt for Python
+# Quickstart guide with Bolt for Python
This quickstart guide aims to help you get a Slack app using Bolt for Python up and running as soon as possible!
@@ -14,20 +13,20 @@ When complete, you'll have a local environment configured with a customized [app
:::tip[Reference for readers]
-In search of the complete guide to building an app from scratch? Check out the [building an app](/building-an-app) guide.
+In search of the complete guide to building an app from scratch? Check out the [building an app](/tools/bolt-python/building-an-app) guide.
:::
#### Prerequisites
-A few tools are needed for the following steps. We recommend using the [**Slack CLI**](https://tools.slack.dev/slack-cli/) for the smoothest experience, but other options remain available.
+A few tools are needed for the following steps. We recommend using the [**Slack CLI**](/tools/slack-cli/) for the smoothest experience, but other options remain available.
You can also begin by installing git and downloading [Python 3.6 or later](https://www.python.org/downloads/), or the latest stable version of Python. Refer to [Python's setup and building guide](https://devguide.python.org/getting-started/setup-building/) for more details.
Install the latest version of the Slack CLI to get started:
-- [Slack CLI for macOS & Linux](https://tools.slack.dev/slack-cli/guides/installing-the-slack-cli-for-mac-and-linux)
-- [Slack CLI for Windows](https://tools.slack.dev/slack-cli/guides/installing-the-slack-cli-for-windows)
+- [Slack CLI for macOS & Linux](/tools/slack-cli/guides/installing-the-slack-cli-for-mac-and-linux)
+- [Slack CLI for Windows](/tools/slack-cli/guides/installing-the-slack-cli-for-windows)
Then confirm a successful installation with the following command:
@@ -45,7 +44,7 @@ $ slack login
A workspace where development can happen is also needed.
-We recommend using [developer sandboxes](https://docs.slack.dev/tools/developer-sandboxes) to avoid disruptions where real work gets done.
+We recommend using [developer sandboxes](/tools/developer-sandboxes) to avoid disruptions where real work gets done.
:::
@@ -133,9 +132,9 @@ Navigate to your list of apps and [create a new Slack app](https://api.slack.com
You'll then land on your app's **Basic Information** page, which is an overview of your app and which contains important credentials:
-
+
-To listen for events happening in Slack (such as a new posted message) without opening a port or exposing an endpoint, we will use [Socket Mode](/concepts/socket-mode). This connection requires a specific app token:
+To listen for events happening in Slack (such as a new posted message) without opening a port or exposing an endpoint, we will use [Socket Mode](/tools/bolt-python/concepts/socket-mode). This connection requires a specific app token:
1. On the **Basic Information** page, scroll to the **App-Level Tokens** section and click **Generate Token and Scopes**.
2. Name the token "Development" or something similar and add the `connections:write` scope, then click **Generate**.
@@ -149,7 +148,7 @@ The above command works on Linux and macOS but [similar commands are available o
:::warning[Keep it secret. Keep it safe.]
-Treat your tokens like a password and [keep it safe](https://docs.slack.dev/authentication/best-practices-for-security). Your app uses these to retrieve and send information to Slack.
+Treat your tokens like a password and [keep it safe](/authentication/best-practices-for-security). Your app uses these to retrieve and send information to Slack.
:::
@@ -158,7 +157,7 @@ A bot token is also needed to interact with the Web API methods as your app's bo
1. Navigate to the **OAuth & Permissions** on the left sidebar and install your app to your workspace to generate a token.
2. After authorizing the installation, you'll return to the **OAuth & Permissions** page and find a **Bot User OAuth Token**:
-
+
3. Copy the bot token beginning with `xoxb` from the **OAuth & Permissions page** and then store it in a new environment variable:
@@ -252,7 +251,7 @@ Your app can be stopped again by pressing `CTRL+C` in the terminal to end these
#### Customizing app settings
-The created app will have some placeholder values and a small set of [scopes](https://docs.slack.dev/reference/scopes) to start, but we recommend exploring the customizations possible on app settings.
+The created app will have some placeholder values and a small set of [scopes](/reference/scopes) to start, but we recommend exploring the customizations possible on app settings.
@@ -265,7 +264,7 @@ $ slack app settings
This will open the following page in a web browser:
-
+
@@ -274,7 +273,7 @@ Browse to https://api.slack.com/apps and select your app "Getting Started Bolt A
This will open the following page:
-
+
@@ -287,14 +286,14 @@ Congrats once more on getting up and running with this quick start.
:::info[Dive deeper]
-Follow along with the steps that went into making this app on the [building an app](/building-an-app) guide for an educational overview.
+Follow along with the steps that went into making this app on the [building an app](/tools/bolt-python/building-an-app) guide for an educational overview.
:::
You can now continue customizing your app with various features to make it right for whatever job's at hand. Here are some ideas about what to explore next:
-- Explore the different events your bot can listen to with the [`app.event()`](/concepts/event-listening) method. All of the [events](https://docs.slack.dev/reference/events) are listed on the API docs site.
-- Bolt allows you to call [Web API](/concepts/web-api) methods with the client attached to your app. There are [over 200 methods](https://docs.slack.dev/reference/methods) on the API docs site.
-- Learn more about the different [token types](https://docs.slack.dev/authentication/tokens) and [authentication setups](/concepts/authenticating-oauth). Your app might need different tokens depending on the actions you want to perform or for installations to multiple workspaces.
-- Receive events using HTTP for various deployment methods, such as deploying to [Heroku](/deployments/heroku) or [AWS Lambda](/deployments/aws-lambda).
-- Read on [app design](https://docs.slack.dev/surfaces/app-design) and compose fancy messages with blocks using [Block Kit Builder](https://app.slack.com/block-kit-builder) to prototype messages.
+- Explore the different events your bot can listen to with the [`app.event()`](/tools/bolt-python/concepts/event-listening) method. All of the [events](/reference/events) are listed on the API docs site.
+- Bolt allows you to call [Web API](/tools/bolt-python/concepts/web-api) methods with the client attached to your app. There are [over 200 methods](/reference/methods) on the API docs site.
+- Learn more about the different [token types](/authentication/tokens) and [authentication setups](/tools/bolt-python/concepts/authenticating-oauth). Your app might need different tokens depending on the actions you want to perform or for installations to multiple workspaces.
+- Receive events using HTTP for various deployment methods, such as deploying to Heroku or AWS Lambda.
+- Read on [app design](/surfaces/app-design) and compose fancy messages with blocks using [Block Kit Builder](https://app.slack.com/block-kit-builder) to prototype messages.
diff --git a/docs/content/index.md b/docs/english/index.md
similarity index 93%
rename from docs/content/index.md
rename to docs/english/index.md
index 33204bca1..212bd9690 100644
--- a/docs/content/index.md
+++ b/docs/english/index.md
@@ -1,6 +1,6 @@
# Bolt for Python
-Bolt for Python is a Python framework to build Slack apps with the latest Slack platform features. Read the [Getting Started Guide](/getting-started) to set up and run your first Bolt app.
+Bolt for Python is a Python framework to build Slack apps with the latest Slack platform features. Read the [Getting Started Guide](/tools/bolt-python/getting-started) to set up and run your first Bolt app.
Then, explore the rest of the pages within the Guides section. The documentation there will help you build a Bolt app for whatever use case you may have.
diff --git a/docs/content/concepts/steps-from-apps.md b/docs/english/legacy/steps-from-apps.md
similarity index 67%
rename from docs/content/concepts/steps-from-apps.md
rename to docs/english/legacy/steps-from-apps.md
index 09becda0c..03b9fa8ff 100644
--- a/docs/content/concepts/steps-from-apps.md
+++ b/docs/english/legacy/steps-from-apps.md
@@ -1,20 +1,14 @@
----
-title: Steps from apps
-lang: en
-slug: /legacy/steps-from-apps
----
+# Steps from apps
-:::danger
+:::danger[Steps from Apps is a deprecated feature.]
-Steps from Apps is a deprecated feature.
+Steps from Apps are different than, and not interchangeable with, Slack automation workflows. We encourage those who are currently publishing steps from apps to consider the new [Slack automation features](/workflows/), such as [custom steps for Bolt](/workflows/workflow-steps).
-Steps from Apps are different than, and not interchangeable with, Slack automation workflows. We encourage those who are currently publishing steps from apps to consider the new [Slack automation features](https://docs.slack.dev/workflows/), such as [custom steps for Bolt](https://docs.slack.dev/workflows/workflow-steps).
-
-Please [read the Slack API changelog entry](https://docs.slack.dev/changelog/2023-08-workflow-steps-from-apps-step-back) for more information.
+Please [read the Slack API changelog entry](/changelog/2023-08-workflow-steps-from-apps-step-back) for more information.
:::
-Steps from apps allow your app to create and process steps that users can add using [Workflow Builder](https://docs.slack.dev/workflows/workflow-builder).
+Steps from apps allow your app to create and process steps that users can add using [Workflow Builder](/workflows/workflow-builder).
Steps from apps are made up of three distinct user events:
@@ -24,7 +18,7 @@ Steps from apps are made up of three distinct user events:
All three events must be handled for a step from app to function.
-Read more about steps from apps in the [API documentation](https://docs.slack.dev/workflows/workflow-steps).
+Read more about steps from apps in the [API documentation](/workflows/workflow-steps).
## Creating steps from apps
@@ -36,9 +30,9 @@ The configuration object contains three keys: `edit`, `save`, and `execute`. Eac
After instantiating a `WorkflowStep`, you can pass it into `app.step()`. Behind the scenes, your app will listen and respond to the step’s events using the callbacks provided in the configuration object.
-Alternatively, steps from apps can also be created using the `WorkflowStepBuilder` class alongside a decorator pattern. For more information, including an example of this approach, [refer to the documentation](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/workflows/step/step.html#slack_bolt.workflows.step.step.WorkflowStepBuilder).
+Alternatively, steps from apps can also be created using the `WorkflowStepBuilder` class alongside a decorator pattern. For more information, including an example of this approach, [refer to the documentation](https://docs.slack.dev/tools/bolt-python/reference/workflows/step/step.html#slack_bolt.workflows.step.step.WorkflowStepBuilder).
-Refer to the module documents ([common](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) / [step-specific](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/workflows/step/utilities/index.html)) to learn the available arguments.
+Refer to the module documents ([common](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) / [step-specific](https://docs.slack.dev/tools/bolt-python/reference/workflows/step/utilities/index.html)) to learn the available arguments.
```python
import os
@@ -74,15 +68,15 @@ app.step(ws)
## Adding or editing steps from apps
-When a builder adds (or later edits) your step in their workflow, your app will receive a [`workflow_step_edit` event](https://docs.slack.dev/legacy/legacy-steps-from-apps/legacy-steps-from-apps-workflow_step_edit-payload). The `edit` callback in your `WorkflowStep` configuration will be run when this event is received.
+When a builder adds (or later edits) your step in their workflow, your app will receive a [`workflow_step_edit` event](/legacy/legacy-steps-from-apps/legacy-steps-from-apps-workflow_step_edit-payload). The `edit` callback in your `WorkflowStep` configuration will be run when this event is received.
-Whether a builder is adding or editing a step, you need to send them a [step from app configuration modal](https://docs.slack.dev/legacy/legacy-steps-from-apps/legacy-steps-from-apps-configuration-view-object). This modal is where step-specific settings are chosen, and it has more restrictions than typical modals—most notably, it cannot include `title`, `submit`, or `close` properties. By default, the configuration modal's `callback_id` will be the same as the step from app.
+Whether a builder is adding or editing a step, you need to send them a [step from app configuration modal](/legacy/legacy-steps-from-apps/legacy-steps-from-apps-configuration-view-object). This modal is where step-specific settings are chosen, and it has more restrictions than typical modals—most notably, it cannot include `title`, `submit`, or `close` properties. By default, the configuration modal's `callback_id` will be the same as the step from app.
Within the `edit` callback, the `configure()` utility can be used to easily open your step's configuration modal by passing in the view's blocks with the corresponding `blocks` argument. To disable saving the configuration before certain conditions are met, you can also pass in `submit_disabled` with a value of `True`.
-To learn more about opening configuration modals, [read the documentation](https://docs.slack.dev/legacy/legacy-steps-from-apps/).
+To learn more about opening configuration modals, [read the documentation](/legacy/legacy-steps-from-apps/).
-Refer to the module documents ([common](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) / [step-specific](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/workflows/step/utilities/index.html)) to learn the available arguments.
+Refer to the module documents ([common](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) / [step-specific](https://docs.slack.dev/tools/bolt-python/reference/workflows/step/utilities/index.html)) to learn the available arguments.
```python
def edit(ack, step, configure):
@@ -132,9 +126,9 @@ Within the `save` callback, the `update()` method can be used to save the builde
- `step_name` overrides the default Step name
- `step_image_url` overrides the default Step image
-To learn more about how to structure these parameters, [read the documentation](https://docs.slack.dev/legacy/legacy-steps-from-apps/).
+To learn more about how to structure these parameters, [read the documentation](/legacy/legacy-steps-from-apps/).
-Refer to the module documents ([common](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) / [step-specific](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/workflows/step/utilities/index.html)) to learn the available arguments.
+Refer to the module documents ([common](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) / [step-specific](https://docs.slack.dev/tools/bolt-python/reference/workflows/step/utilities/index.html)) to learn the available arguments.
```python
def save(ack, view, update):
@@ -173,13 +167,13 @@ app.step(ws)
## Executing steps from apps
-When your step from app is executed by an end user, your app will receive a [`workflow_step_execute` event](https://docs.slack.dev/legacy/legacy-steps-from-apps/legacy-steps-from-apps-workflow_step-object). The `execute` callback in your `WorkflowStep` configuration will be run when this event is received.
+When your step from app is executed by an end user, your app will receive a [`workflow_step_execute` event](/legacy/legacy-steps-from-apps/legacy-steps-from-apps-workflow_step-object). The `execute` callback in your `WorkflowStep` configuration will be run when this event is received.
Using the `inputs` from the `save` callback, this is where you can make third-party API calls, save information to a database, update the user's Home tab, or decide the outputs that will be available to subsequent steps from apps by mapping values to the `outputs` object.
Within the `execute` callback, your app must either call `complete()` to indicate that the step's execution was successful, or `fail()` to indicate that the step's execution failed.
-Refer to the module documents ([common](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/kwargs_injection/args.html) / [step-specific](https://tools.slack.dev/bolt-python/api-docs/slack_bolt/workflows/step/utilities/index.html)) to learn the available arguments.
+Refer to the module documents ([common](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) / [step-specific](https://docs.slack.dev/tools/bolt-python/reference/workflows/step/utilities/index.html)) to learn the available arguments.
```python
def execute(step, complete, fail):
diff --git a/docs/static/img/tutorials/ai-chatbot/1.png b/docs/english/tutorial/ai-chatbot/1.png
similarity index 100%
rename from docs/static/img/tutorials/ai-chatbot/1.png
rename to docs/english/tutorial/ai-chatbot/1.png
diff --git a/docs/static/img/tutorials/ai-chatbot/2.png b/docs/english/tutorial/ai-chatbot/2.png
similarity index 100%
rename from docs/static/img/tutorials/ai-chatbot/2.png
rename to docs/english/tutorial/ai-chatbot/2.png
diff --git a/docs/static/img/tutorials/ai-chatbot/3.png b/docs/english/tutorial/ai-chatbot/3.png
similarity index 100%
rename from docs/static/img/tutorials/ai-chatbot/3.png
rename to docs/english/tutorial/ai-chatbot/3.png
diff --git a/docs/static/img/tutorials/ai-chatbot/4.png b/docs/english/tutorial/ai-chatbot/4.png
similarity index 100%
rename from docs/static/img/tutorials/ai-chatbot/4.png
rename to docs/english/tutorial/ai-chatbot/4.png
diff --git a/docs/static/img/tutorials/ai-chatbot/5.png b/docs/english/tutorial/ai-chatbot/5.png
similarity index 100%
rename from docs/static/img/tutorials/ai-chatbot/5.png
rename to docs/english/tutorial/ai-chatbot/5.png
diff --git a/docs/static/img/tutorials/ai-chatbot/6.png b/docs/english/tutorial/ai-chatbot/6.png
similarity index 100%
rename from docs/static/img/tutorials/ai-chatbot/6.png
rename to docs/english/tutorial/ai-chatbot/6.png
diff --git a/docs/static/img/tutorials/ai-chatbot/7.png b/docs/english/tutorial/ai-chatbot/7.png
similarity index 100%
rename from docs/static/img/tutorials/ai-chatbot/7.png
rename to docs/english/tutorial/ai-chatbot/7.png
diff --git a/docs/static/img/tutorials/ai-chatbot/8.png b/docs/english/tutorial/ai-chatbot/8.png
similarity index 100%
rename from docs/static/img/tutorials/ai-chatbot/8.png
rename to docs/english/tutorial/ai-chatbot/8.png
diff --git a/docs/content/tutorial/ai-chatbot.md b/docs/english/tutorial/ai-chatbot/ai-chatbot.md
similarity index 88%
rename from docs/content/tutorial/ai-chatbot.md
rename to docs/english/tutorial/ai-chatbot/ai-chatbot.md
index 7db10b722..fa4da90a7 100644
--- a/docs/content/tutorial/ai-chatbot.md
+++ b/docs/english/tutorial/ai-chatbot/ai-chatbot.md
@@ -32,7 +32,7 @@ If you'd rather skip the tutorial and just head straight to the code, you can us
Before you'll be able to successfully run the app, you'll need to first obtain and set some environment variables.
1. On the **Install App** page, copy your **Bot User OAuth Token**. You will store this in your environment as `SLACK_BOT_TOKEN` (we'll get to that next).
-2. Navigate to **Basic Information** and in the **App-Level Tokens** section , click **Generate Token and Scopes**. Add the [`connections:write`](https://docs.slack.dev/reference/scopes/connections.write) scope, name the token, and click **Generate**. (For more details, refer to [understanding OAuth scopes for bots](https://docs.slack.dev/authentication/tokens#bot)). Copy this token. You will store this in your environment as `SLACK_APP_TOKEN`.
+2. Navigate to **Basic Information** and in the **App-Level Tokens** section , click **Generate Token and Scopes**. Add the [`connections:write`](/reference/scopes/connections.write) scope, name the token, and click **Generate**. (For more details, refer to [understanding OAuth scopes for bots](/authentication/tokens#bot)). Copy this token. You will store this in your environment as `SLACK_APP_TOKEN`.
To store your tokens and environment variables, run the following commands in the terminal. Replace the placeholder values with your bot and app tokens collected above, as well as the key or keys for the AI provider or providers you want to use:
@@ -100,7 +100,7 @@ Navigate to the Bolty **App Home** and select a provider from the drop-down menu
If you don't see Bolty listed under **Apps** in your workspace right away, never fear! You can mention **@Bolty** in a public channel to add the app, then navigate to your **App Home**.
-
+
## Setting up your workflow {#workflow}
@@ -108,11 +108,11 @@ Within your development workspace, open Workflow Builder by clicking on your wor
Click **Untitled Workflow** at the top to rename your workflow. For this tutorial, we'll call the workflow **Welcome to the channel**. Enter a description, such as _Summarizes channels for new members_, and click **Save**.
-
+
Select **Choose an event** under **Start the workflow...**, and then choose **When a person joins a channel**. Select the channel name from the drop-down menu and click **Save**.
-
+
Under **Then, do these things**, click **Add steps** and complete the following:
@@ -121,20 +121,20 @@ Under **Then, do these things**, click **Add steps** and complete the following:
3. Under **Add a message**, enter a short message, such as _Hi! Welcome to `{}The channel that the user joined`. Would you like a summary of the recent conversation?_ Note that the _`{}The channel that the user joined`_ is a variable; you can insert it by selecting **{}Insert a variable** at the bottom of the message text box.
4. Select the **Add Button** button, and name the button _Yes, give me a summary_. Click **Done**.
-
+
We'll add two more steps under the **Then, do these things** section.
First, scroll to the bottom of the list of steps and choose **Custom**, then choose **Bolty** and **Bolty Custom Function**. In the **Channel** drop-down menu, select **Channel that the user joined**. Click **Save**.
-
+
For the final step, complete the following:
1. Choose **Messages** and then **Send a message to a person**. Under **Select a member**, choose **Person who clicked the button** from the drop-down menu.
2. Under **Add a message**, click **Insert a variable** and choose **`{}Summary`** under the **Bolty Custom Function** section in the list that appears. Click **Save**.
-
+
When finished, click **Finish Up**, then click **Publish** to make the workflow available in your workspace.
@@ -149,9 +149,9 @@ In order for Bolty to provide summaries of recent conversation in a channel, Bol
To test this, leave the channel you just invited Bolty to and rejoin it. This will kick off your workflow and you'll receive a direct message from **Welcome to the channel**. Click the **Yes, give me a summary** button, and Bolty will summarize the recent conversations in the channel you joined.
-
+
-The central part of this functionality is shown in the following code snippet. Note the use of the [`user_context`](https://tools.slack.dev/deno-slack-sdk/reference/slack-types#usercontext) object, a Slack type that represents the user who is interacting with our workflow, as well as the `history` of the channel that will be summarized, which includes the ten most recent messages.
+The central part of this functionality is shown in the following code snippet. Note the use of the [`user_context`](/tools/deno-slack-sdk/reference/slack-types#usercontext) object, a Slack type that represents the user who is interacting with our workflow, as well as the `history` of the channel that will be summarized, which includes the ten most recent messages.
```python
from ai.providers import get_provider_response
@@ -191,12 +191,12 @@ To ask Bolty a question, you can chat with Bolty in any channel the app is in. U
You can also navigate to **Bolty** in your **Apps** list and select the **Messages** tab to chat with Bolty directly.
-
+
## Next steps {#next-steps}
Congratulations! You've successfully integrated the power of AI into your workspace. Check out these links to take the next steps in your Bolt for Python journey.
-* To learn more about Bolt for Python, refer to the [Getting started](../getting-started) documentation.
-* For more details about creating workflow steps using the Bolt SDK, refer to the [workflow steps for Bolt](https://docs.slack.dev/workflows/workflow-steps) guide.
-* To use the Bolt for Python SDK to develop on the automations platform, refer to the [Create a workflow step for Workflow Builder: Bolt for Python](/bolt-python/tutorial/custom-steps) tutorial.
+* To learn more about Bolt for Python, refer to the [Getting started](/tools/bolt-python/getting-started) documentation.
+* For more details about creating workflow steps using the Bolt SDK, refer to the [workflow steps for Bolt](/workflows/workflow-steps) guide.
+* To use the Bolt for Python SDK to develop on the automations platform, refer to the [Create a workflow step for Workflow Builder: Bolt for Python](/tools/bolt-python/tutorial/custom-steps-workflow-builder-new) tutorial.
diff --git a/docs/static/img/tutorials/custom-steps-jira/1.png b/docs/english/tutorial/custom-steps-for-jira/1.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-jira/1.png
rename to docs/english/tutorial/custom-steps-for-jira/1.png
diff --git a/docs/static/img/tutorials/custom-steps-jira/2.png b/docs/english/tutorial/custom-steps-for-jira/2.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-jira/2.png
rename to docs/english/tutorial/custom-steps-for-jira/2.png
diff --git a/docs/static/img/tutorials/custom-steps-jira/3.png b/docs/english/tutorial/custom-steps-for-jira/3.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-jira/3.png
rename to docs/english/tutorial/custom-steps-for-jira/3.png
diff --git a/docs/static/img/tutorials/custom-steps-jira/4.png b/docs/english/tutorial/custom-steps-for-jira/4.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-jira/4.png
rename to docs/english/tutorial/custom-steps-for-jira/4.png
diff --git a/docs/static/img/tutorials/custom-steps-jira/5.png b/docs/english/tutorial/custom-steps-for-jira/5.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-jira/5.png
rename to docs/english/tutorial/custom-steps-for-jira/5.png
diff --git a/docs/static/img/tutorials/custom-steps-jira/6.png b/docs/english/tutorial/custom-steps-for-jira/6.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-jira/6.png
rename to docs/english/tutorial/custom-steps-for-jira/6.png
diff --git a/docs/static/img/tutorials/custom-steps-jira/7.png b/docs/english/tutorial/custom-steps-for-jira/7.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-jira/7.png
rename to docs/english/tutorial/custom-steps-for-jira/7.png
diff --git a/docs/content/tutorial/custom-steps-for-jira.md b/docs/english/tutorial/custom-steps-for-jira/custom-steps-for-jira.md
similarity index 86%
rename from docs/content/tutorial/custom-steps-for-jira.md
rename to docs/english/tutorial/custom-steps-for-jira/custom-steps-for-jira.md
index b38f9337c..f310e75cc 100644
--- a/docs/content/tutorial/custom-steps-for-jira.md
+++ b/docs/english/tutorial/custom-steps-for-jira/custom-steps-for-jira.md
@@ -11,7 +11,7 @@ In this tutorial, you'll learn how to configure custom steps for use with JIRA.
Before getting started, you will need the following:
-* a development workspace where you have permissions to install apps. If you don’t have a workspace, go ahead and set that up now—you can [go here](https://slack.com/get-started#create) to create one, or you can join the [Developer Program](https://api.slack.com/developer-program) and provision a sandbox with access to all Slack features for free.
+* a development workspace where you have permissions to install apps. If you don’t have a workspace, go ahead and set that up now—you can [go here](https://slack.com/get-started#create) to create one, or you can join the [Developer Program](https://api.slack.com/developer-program) and provision a sandbox with access to all Slack features for free.
* a development environment with [Python 3.6](https://www.python.org/downloads/) or later.
**Skip to the code**
@@ -35,7 +35,7 @@ https://github.com/slack-samples/bolt-python-jira-functions/blob/main/manifest.j
Before you'll be able to successfully run the app, you'll need to obtain and set some environment variables.
1. Once you have installed the app to your workspace, copy the **Bot User OAuth Token** from the **Install App** page. You will store this in your environment as `SLACK_BOT_TOKEN` (we'll get to that next).
-2. Navigate to **Basic Information** and in the **App-Level Tokens** section , click **Generate Token and Scopes**. Add the [`connections:write`](https://docs.slack.dev/reference/scopes/connections.write) scope, name the token, and click **Generate**. Copy this token. You will store this in your environment as `SLACK_APP_TOKEN`.
+2. Navigate to **Basic Information** and in the **App-Level Tokens** section , click **Generate Token and Scopes**. Add the [`connections:write`](/reference/scopes/connections.write) scope, name the token, and click **Generate**. Copy this token. You will store this in your environment as `SLACK_APP_TOKEN`.
3. Follow [these instructions](https://confluence.atlassian.com/adminjiraserver0909/configure-an-incoming-link-1251415519.html) to create an external app link and to generate its redirect URL (the base of which will be stored as your APP_BASE_URL variable below), client ID, and client secret.
4. Run the following commands in your terminal to store your environment variables, client ID, and client secret.
5. You'll also need to know your team ID (found by opening your Slack instance in a web browser and copying the value within the link that starts with the letter **T**) and your app ID (found under **Basic Information**).
@@ -127,21 +127,21 @@ If your app is up and running, you'll see a message noting that the app is start
2. Select **New Workflow** > **Build Workflow**.
3. Click **Untitled Workflow** at the top of the pane to rename your workflow. We'll call it **Create Issue**. For the description, enter _Creates a new issue_, then click **Save**.
-
+
4. Select **Choose an event** under **Start the workflow...**, and then select **From a link in Slack**. Click **Continue**.
-
+
5. Under **Then, do these things** click **Add steps** to add the custom step. Your custom step will be the function defined in the [`create_issue.py`](https://github.com/slack-samples/bolt-python-jira-functions/blob/main/listeners/functions/create_issue.py) file.
Scroll down to the bottom of the list on the right-hand pane and select **Custom**, then **BoltPy Jira Functions** > **Create an issue**. Enter the project details, issue type (optional), summary (optional), and description (optional). Click **Save**.
-
+
6. Add another step and select **Messages** > **Send a message to a channel**. Select **Channel where the workflow was used** from the drop-down list and then select **Insert a variable** and **Issue url**. Click **Save**.
-
+
7. Click **Publish** to make the workflow available to your workspace.
@@ -150,16 +150,16 @@ If your app is up and running, you'll see a message noting that the app is start
1. Copy your workflow link.
2. Navigate to your app's home tab and click **Connect an Account** to connect your JIRA account to the app.
-
+
3. Click **Allow** on the screen that appears.
-
+
4. In any channel, post the workflow link you copied.
5. Click **Start Workflow** and observe as the link to a new JIRA ticket is posted in the channel. Click the link to be directed to the newly-created issue within your JIRA project.
-
+
When finished, you can click the **Disconnect Account** button in the home tab to disconnect your app from your JIRA account.
@@ -167,6 +167,6 @@ When finished, you can click the **Disconnect Account** button in the home tab t
Congratulations! You've successfully customized your workspace with custom steps in Workflow Builder. Check out these links to take the next steps in your journey.
-* To learn more about Bolt for Python, refer to the [getting started](/getting-started) documentation.
-* For more details about creating workflow steps using the Bolt SDK, refer to the [workflow steps for Bolt](https://docs.slack.dev/workflows/workflow-steps) guide.
-* For information about custom steps dynamic options, refer to [custom steps dynamic options in Workflow Builder](https://docs.slack.dev/workflows/creating-custom-steps-dynamic-options).
+* To learn more about Bolt for Python, refer to the [getting started](/tools/bolt-python/getting-started) documentation.
+* For more details about creating workflow steps using the Bolt SDK, refer to the [workflow steps for Bolt](/workflows/workflow-steps) guide.
+* For information about custom steps dynamic options, refer to [custom steps dynamic options in Workflow Builder](/tools/bolt-python/concepts/custom-steps-dynamic-options).
diff --git a/docs/static/img/tutorials/custom-steps-wfb-existing/add-step.png b/docs/english/tutorial/custom-steps-workflow-builder-existing/add-step.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-existing/add-step.png
rename to docs/english/tutorial/custom-steps-workflow-builder-existing/add-step.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-existing/app-message.png b/docs/english/tutorial/custom-steps-workflow-builder-existing/app-message.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-existing/app-message.png
rename to docs/english/tutorial/custom-steps-workflow-builder-existing/app-message.png
diff --git a/docs/content/tutorial/custom-steps-workflow-builder-existing.md b/docs/english/tutorial/custom-steps-workflow-builder-existing/custom-steps-workflow-builder-existing.md
similarity index 91%
rename from docs/content/tutorial/custom-steps-workflow-builder-existing.md
rename to docs/english/tutorial/custom-steps-workflow-builder-existing/custom-steps-workflow-builder-existing.md
index e5c584a4c..0441b033c 100644
--- a/docs/content/tutorial/custom-steps-workflow-builder-existing.md
+++ b/docs/english/tutorial/custom-steps-workflow-builder-existing/custom-steps-workflow-builder-existing.md
@@ -1,12 +1,10 @@
----
-title: Custom Steps for Workflow Builder (existing app)
----
+# Custom Steps for Workflow Builder (existing app)
:::info[This feature requires a paid plan]
If you don't have a paid workspace for development, you can join the [Developer Program](https://api.slack.com/developer-program) and provision a sandbox with access to all Slack features for free.
:::
-If you followed along with our [create a custom step for Workflow Builder: new app](/tutorial/custom-steps-workflow-builder-new) tutorial, you have seen how to add custom steps to a brand new app. But what if you have an app up and running currently to which you'd like to add custom steps? You've come to the right place!
+If you followed along with our [create a custom step for Workflow Builder: new app](/tools/bolt-python/tutorial/custom-steps-workflow-builder-new) tutorial, you have seen how to add custom steps to a brand new app. But what if you have an app up and running currently to which you'd like to add custom steps? You've come to the right place!
In this tutorial we will:
- Start with an existing Bolt app
@@ -28,7 +26,7 @@ In order to add custom workflow steps to an app, the app also needs to be org-re
Navigate to **Org Level Apps** in the left nav and click **Opt-In**, then confirm **Yes, Opt-In**.
-
+
## Adding a new workflow step {#add-step}
@@ -54,19 +52,19 @@ Navigate to **App Manifest** in the left nav and add the `function_executed` eve
Navigate to **Workflow Steps** in the left nav and click **Add Step**. This is where we'll configure our step's inputs, outputs, name, and description.
-
+
For illustration purposes in this tutorial, we're going to write a custom step called Request Time Off. When the step is invoked, a message will be sent to the provided manager with an option to approve or deny the time-off request. When the manager takes an action (approves or denies the request), a message is posted with the decision and the manager who made the decision. The step will take two user IDs as inputs, representing the requesting user and their manager, and it will output both of those user IDs as well as the decision made.
Add the pertinent details to the step:
-
+
Remember this `callback_id`. We will use this later when implementing a function listener. Then add the input and output parameters:
-
+
-
+
Save your changes.
@@ -260,11 +258,11 @@ Click the button to create a **New Workflow**, then **Build Workflow**. Choose t
In the **Steps** pane to the right, search for your app name and locate the **Request time off** step we created.
-
+
Select the step and choose the desired inputs and click **Save**.
-
+
Next, click **Finish Up**, give your workflow a name and description, then click **Publish**. Copy the link for your workflow on the next screen, then click **Done**.
@@ -272,12 +270,12 @@ Next, click **Finish Up**, give your workflow a name and description, then click
In any channel where your app is installed, paste the link you copied and send it as a message. The link will unfurl into a button to start the workflow. Click the button to start the workflow. If you set yourself up as the manager, you will then see a message from your app. Pressing either button will return a confirmation or denial of your time off request.
-
+
## Next steps {#next-steps}
Nice work! Now that you've added a workflow step to your Bolt app, a world of possibilities is open to you! Create and share workflow steps across your organization to optimize Slack users' time and make their working lives more productive.
-If you're looking to create a brand new Bolt app with custom workflow steps, check out [the tutorial here](/tutorial/custom-steps-workflow-builder-new).
+If you're looking to create a brand new Bolt app with custom workflow steps, check out [the tutorial here](/tools/bolt-python/tutorial/custom-steps-workflow-builder-new).
-If you're interested in exploring how to create custom steps to use in Workflow Builder as steps with our Deno Slack SDK, too, that tutorial can be found [here](https://tools.slack.dev/deno-slack-sdk/tutorials/workflow-builder-custom-step/).
+If you're interested in exploring how to create custom steps to use in Workflow Builder as steps with our Deno Slack SDK, too, that tutorial can be found [here](/tools/deno-slack-sdk/tutorials/workflow-builder-custom-step/).
diff --git a/docs/static/img/tutorials/custom-steps-wfb-existing/define-step.png b/docs/english/tutorial/custom-steps-workflow-builder-existing/define-step.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-existing/define-step.png
rename to docs/english/tutorial/custom-steps-workflow-builder-existing/define-step.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-existing/find-step.png b/docs/english/tutorial/custom-steps-workflow-builder-existing/find-step.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-existing/find-step.png
rename to docs/english/tutorial/custom-steps-workflow-builder-existing/find-step.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-existing/inputs.png b/docs/english/tutorial/custom-steps-workflow-builder-existing/inputs.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-existing/inputs.png
rename to docs/english/tutorial/custom-steps-workflow-builder-existing/inputs.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-existing/org-ready.png b/docs/english/tutorial/custom-steps-workflow-builder-existing/org-ready.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-existing/org-ready.png
rename to docs/english/tutorial/custom-steps-workflow-builder-existing/org-ready.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-existing/outputs.png b/docs/english/tutorial/custom-steps-workflow-builder-existing/outputs.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-existing/outputs.png
rename to docs/english/tutorial/custom-steps-workflow-builder-existing/outputs.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-existing/step-inputs.png b/docs/english/tutorial/custom-steps-workflow-builder-existing/step-inputs.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-existing/step-inputs.png
rename to docs/english/tutorial/custom-steps-workflow-builder-existing/step-inputs.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-new/app-token.png b/docs/english/tutorial/custom-steps-workflow-builder-new/app-token.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-new/app-token.png
rename to docs/english/tutorial/custom-steps-workflow-builder-new/app-token.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-new/bot-token.png b/docs/english/tutorial/custom-steps-workflow-builder-new/bot-token.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-new/bot-token.png
rename to docs/english/tutorial/custom-steps-workflow-builder-new/bot-token.png
diff --git a/docs/content/tutorial/custom-steps-workflow-builder-new.md b/docs/english/tutorial/custom-steps-workflow-builder-new/custom-steps-workflow-builder-new.md
similarity index 90%
rename from docs/content/tutorial/custom-steps-workflow-builder-new.md
rename to docs/english/tutorial/custom-steps-workflow-builder-new/custom-steps-workflow-builder-new.md
index 9d01b8676..1dceed45a 100644
--- a/docs/content/tutorial/custom-steps-workflow-builder-new.md
+++ b/docs/english/tutorial/custom-steps-workflow-builder-new/custom-steps-workflow-builder-new.md
@@ -1,12 +1,10 @@
----
-title: Custom Steps for Workflow Builder (new app)
----
+# Custom Steps for Workflow Builder (new app)
:::info[This feature requires a paid plan]
If you don't have a paid workspace for development, you can join the [Developer Program](https://api.slack.com/developer-program) and provision a sandbox with access to all Slack features for free.
:::
-Adding a workflow step to your app and implementing a corresponding function listener is how you define a custom Workflow Builder step. In this tutorial, you'll use [Bolt for Python](/bolt-python/) to add your workflow step, then wire it up in [Workflow Builder](https://slack.com/help/articles/360035692513-Guide-to-Workflow-Builder).
+Adding a workflow step to your app and implementing a corresponding function listener is how you define a custom Workflow Builder step. In this tutorial, you'll use [Bolt for Python](/tools/bolt-python/) to add your workflow step, then wire it up in [Workflow Builder](https://slack.com/help/articles/360035692513-Guide-to-Workflow-Builder).
When finished, you'll be ready to build scalable and innovative workflow steps for anyone using Workflow Builder in your workspace.
@@ -58,7 +56,7 @@ We now have a Bolt app ready for development! Open the `manifest.json` file and
Open a browser and navigate to [your apps page](https://api.slack.com/apps). This is where we will create a new app with our previously copied manifest details. Click the **Create New App** button, then select **From an app manifest** when prompted to choose how you'd like to configure your app's settings.
-
+
Next, select a workspace where you have permissions to install apps, and click **Next**. Select the **JSON** tab and clear the existing contents. Paste the contents of the `manifest.json` file you previously copied.
@@ -70,11 +68,11 @@ All of your app's settings can be configured within these screens. By creating a
Navigate to **Event Subscriptions** and expand **Subscribe to bot events** to see that we have subscribed to the `function_executed` event. This is also a requirement for adding workflow steps to our app, as it lets our app know when a step has been triggered, allowing our app to respond to it.
-Another configuration setting to note is **Socket Mode**. We have turned this on for our local development, but socket mode is not intended for use in a production environment. When you are satisfied with your app and ready to deploy it to a production environment, you should switch to using public HTTP request URLs. Read more about getting started with HTTP in [Bolt for Python here](/bolt-python/getting-started).
+Another configuration setting to note is **Socket Mode**. We have turned this on for our local development, but socket mode is not intended for use in a production environment. When you are satisfied with your app and ready to deploy it to a production environment, you should switch to using public HTTP request URLs. Read more about getting started with HTTP in [Bolt for Python here](/tools/bolt-python/getting-started).
Clicking on **Workflow Steps** in the left nav will show you that one workflow step has been added! This reflects the `function` defined in our manifest: functions are workflow steps. We will get to this step's implementation later.
-
+
### Tokens {#tokens}
@@ -85,17 +83,17 @@ In order to connect our app here with the logic of our sample code set up locall
To generate an app token, navigate to **Basic Information** and scroll down to **App-Level Token**.
-
+
Click **Generate Token and Scopes**, then **Add Scope** and choose `connections:write`. Choose a name for your token and click **Generate**. Copy that value, save it somewhere accessible, and click **Done** to close out of the modal.
Next up is the bot token. We can only get this token by installing the app into the workspace. Navigate to **Install App** and click the button to install, choosing **Allow** at the next screen.
-
+
You will then have a bot token. Again, copy that value and save it somewhere accessible.
-
+
💡 Treat your tokens like passwords and keep them safe. Your app uses them to post and retrieve information from Slack workspaces. Minimally, do NOT commit them to version control.
@@ -120,8 +118,7 @@ You'll know the local development server is up and running successfully when it
With your development server running, continue to the next step.
-:::info
-If you need to stop running the local development server, press `` + `c` to end the process.
+:::info[If you need to stop running the local development server, press `` + `c` to end the process.]
:::
## Wiring up the sample step in Workflow Builder {#wfb}
@@ -130,15 +127,15 @@ The starter project you cloned contains a sample custom step lovingly titled “
In the Slack Client of your development workspace, open Workflow Builder by clicking on the workspace name, **Tools**, then **Workflow Builder**. Create a new workflow, then select **Build Workflow**:
-
+
Select **Choose an event** under **Start the workflow...**, then **From a link in Slack** to configure this workflow to start when someone clicks its shortcut link:
-
+
Click the **Continue** button to confirm that this is workflow should start with a shortcut link:
-
+
Find the sample step provided in the template by either searching for the name of your app (e.g., `Bolt Custom Step`) or the name of your step (e.g. `Sample step`) in the Steps search bar.
@@ -146,43 +143,43 @@ If you search by app name, any custom step that your app has defined will be lis
Add the “Sample step" in the search results to the workflow:
-
+
As soon as you add the “Sample step" to the workflow, a modal will appear to configure the step's input—in this case, a user variable:
-
+
Configure the user input to be “Person who used this workflow”, then click the **Save** button:
-
+
Click the **Finish Up** button, then provide a name and description for your workflow.
Finally, click the **Publish** button:
-
+
Copy the shortcut link, then exit Workflow Builder and paste the link to a message in any channel you’re in:
-
+
After you send a message containing the shortcut link, the link will unfurl and you’ll see a **Start Workflow** button.
Click the **Start Workflow** button:
-
+
You should see a new direct message from your app:
-
+
The message from your app asks you to click the **Complete step** button:
-
+
Once you click the button, the direct message to you will be updated to let you know that the step interaction was successfully completed:
-
+
Now that we’ve gotten a feel for how we will use the custom step, let’s learn more about how function listeners work.
@@ -354,6 +351,6 @@ Slack will send an action event payload to your app when the button is clicked o
That's it — we hope you learned a lot!
-In this tutorial, we added custom steps via the manifest, but if you'd like to see how to add custom steps in the [app settings](https://api.slack.com/apps) to an existing app, follow along with the [Create a custom step for Workflow Builder: existing Bolt app](/tutorials/custom-steps-workflow-builder-existing) tutorial.
+In this tutorial, we added custom steps via the manifest, but if you'd like to see how to add custom steps in the [app settings](https://api.slack.com/apps) to an existing app, follow along with the [Create a custom step for Workflow Builder: existing Bolt app](/tools/bolt-python/tutorial/custom-steps-workflow-builder-existing) tutorial.
-If you're interested in exploring how to create custom steps to use in Workflow Builder as steps with our Deno Slack SDK, too, that tutorial can be found [here](https://tools.slack.dev/deno-slack-sdk/tutorials/workflow-builder-custom-step/).
+If you're interested in exploring how to create custom steps to use in Workflow Builder as steps with our Deno Slack SDK, too, that tutorial can be found [here](/tools/deno-slack-sdk/tutorials/workflow-builder-custom-step/).
diff --git a/docs/static/img/tutorials/custom-steps-wfb-new/install.png b/docs/english/tutorial/custom-steps-workflow-builder-new/install.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-new/install.png
rename to docs/english/tutorial/custom-steps-workflow-builder-new/install.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-new/manifest.png b/docs/english/tutorial/custom-steps-workflow-builder-new/manifest.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-new/manifest.png
rename to docs/english/tutorial/custom-steps-workflow-builder-new/manifest.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-new/wfb-1.png b/docs/english/tutorial/custom-steps-workflow-builder-new/wfb-1.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-new/wfb-1.png
rename to docs/english/tutorial/custom-steps-workflow-builder-new/wfb-1.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-new/wfb-10.png b/docs/english/tutorial/custom-steps-workflow-builder-new/wfb-10.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-new/wfb-10.png
rename to docs/english/tutorial/custom-steps-workflow-builder-new/wfb-10.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-new/wfb-11.png b/docs/english/tutorial/custom-steps-workflow-builder-new/wfb-11.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-new/wfb-11.png
rename to docs/english/tutorial/custom-steps-workflow-builder-new/wfb-11.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-new/wfb-12.png b/docs/english/tutorial/custom-steps-workflow-builder-new/wfb-12.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-new/wfb-12.png
rename to docs/english/tutorial/custom-steps-workflow-builder-new/wfb-12.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-new/wfb-2.png b/docs/english/tutorial/custom-steps-workflow-builder-new/wfb-2.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-new/wfb-2.png
rename to docs/english/tutorial/custom-steps-workflow-builder-new/wfb-2.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-new/wfb-3.png b/docs/english/tutorial/custom-steps-workflow-builder-new/wfb-3.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-new/wfb-3.png
rename to docs/english/tutorial/custom-steps-workflow-builder-new/wfb-3.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-new/wfb-4.png b/docs/english/tutorial/custom-steps-workflow-builder-new/wfb-4.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-new/wfb-4.png
rename to docs/english/tutorial/custom-steps-workflow-builder-new/wfb-4.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-new/wfb-5.png b/docs/english/tutorial/custom-steps-workflow-builder-new/wfb-5.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-new/wfb-5.png
rename to docs/english/tutorial/custom-steps-workflow-builder-new/wfb-5.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-new/wfb-6.png b/docs/english/tutorial/custom-steps-workflow-builder-new/wfb-6.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-new/wfb-6.png
rename to docs/english/tutorial/custom-steps-workflow-builder-new/wfb-6.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-new/wfb-7.png b/docs/english/tutorial/custom-steps-workflow-builder-new/wfb-7.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-new/wfb-7.png
rename to docs/english/tutorial/custom-steps-workflow-builder-new/wfb-7.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-new/wfb-8.png b/docs/english/tutorial/custom-steps-workflow-builder-new/wfb-8.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-new/wfb-8.png
rename to docs/english/tutorial/custom-steps-workflow-builder-new/wfb-8.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-new/wfb-9.png b/docs/english/tutorial/custom-steps-workflow-builder-new/wfb-9.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-new/wfb-9.png
rename to docs/english/tutorial/custom-steps-workflow-builder-new/wfb-9.png
diff --git a/docs/static/img/tutorials/custom-steps-wfb-new/workflow-step.png b/docs/english/tutorial/custom-steps-workflow-builder-new/workflow-step.png
similarity index 100%
rename from docs/static/img/tutorials/custom-steps-wfb-new/workflow-step.png
rename to docs/english/tutorial/custom-steps-workflow-builder-new/workflow-step.png
diff --git a/docs/content/tutorial/custom-steps.md b/docs/english/tutorial/custom-steps.md
similarity index 94%
rename from docs/content/tutorial/custom-steps.md
rename to docs/english/tutorial/custom-steps.md
index 2486a49ef..66dc16198 100644
--- a/docs/content/tutorial/custom-steps.md
+++ b/docs/english/tutorial/custom-steps.md
@@ -9,7 +9,7 @@ If you don't have a paid workspace for development, you can join the [Developer
With custom steps for Bolt apps, your app can create and process workflow steps that users later add in Workflow Builder. This guide goes through how to build a custom step for your app using the [app settings](https://api.slack.com/apps).
-If you're looking to build a custom step using the Deno Slack SDK, check out our guide on [creating a custom step for Workflow Builder with the Deno Slack SDK](https://tools.slack.dev/deno-slack-sdk/tutorials/workflow-builder-custom-step/).
+If you're looking to build a custom step using the Deno Slack SDK, check out our guide on [creating a custom step for Workflow Builder with the Deno Slack SDK](/tools/deno-slack-sdk/tutorials/workflow-builder-custom-step/).
You can also take a look at the template for the [Bolt for Python custom workflow step](https://github.com/slack-samples/bolt-python-custom-step-template) on GitHub.
@@ -69,7 +69,7 @@ Field | Type | Description
`type` | String | Defines the data type and can fall into one of two categories: primitives or Slack-specific.
`title` | String | The label that appears in Workflow Builder when a user sets up this step in their workflow.
`description` | String | The description that accompanies the input when a user sets up this step in their workflow.
-`dynamic_options` | Object | For custom steps dynamic options in Workflow Builder, define this property and point to a custom step designed to return the set of dynamic elements once the step is added to a workflow within Workflow Builder. Dynamic options in Workflow Builder can be rendered in one of two ways: as a drop-down menu (single-select or multi-select), or as a set of fields. Refer to custom steps dynamic options for Workflow Builder using [Bolt for JavaScript](https://tools.slack.dev/bolt-js/concepts/custom-steps-dynamic-options/) or [Bolt for Python](https://tools.slack.dev/bolt-python/concepts/custom-steps-dynamic-options/) for more details.
+`dynamic_options` | Object | For custom steps dynamic options in Workflow Builder, define this property and point to a custom step designed to return the set of dynamic elements once the step is added to a workflow within Workflow Builder. Dynamic options in Workflow Builder can be rendered in one of two ways: as a drop-down menu (single-select or multi-select), or as a set of fields. Refer to custom steps dynamic options for Workflow Builder using [Bolt for JavaScript](/tools/bolt-js/concepts/custom-steps-dynamic-options/) or [Bolt for Python](https://docs.slack.dev/tools/bolt-python/concepts/custom-steps-dynamic-options/) for more details.
`is_required` | Boolean | Indicates whether or not the input is required by the step in order to run. If it’s required and not provided, the user will not be able to save the configuration nor use the step in their workflow. This property is available only in v1 of the manifest. We recommend v2, using the `required` array as noted in the example above.
`hint` | String | Helper text that appears below the input when a user sets up this step in their workflow.
@@ -225,7 +225,7 @@ The second argument is the callback function, or the logic that will run when yo
Field | Description
------|------------
-`client` | A `WebClient` instance used to make things happen in Slack. From sending messages to opening modals, `client` makes it all happen. For a full list of available methods, refer to the [Web API methods](/methods). Read more about the `WebClient` for Bolt Python [here](https://tools.slack.dev/bolt-python/concepts/web-api/).
+`client` | A `WebClient` instance used to make things happen in Slack. From sending messages to opening modals, `client` makes it all happen. For a full list of available methods, refer to the [Web API methods](/reference/methods). Read more about the `WebClient` for Bolt Python [here](https://docs.slack.dev/tools/bolt-python/concepts/web-api/).
`complete` | A utility method that invokes `functions.completeSuccess`. This method indicates to Slack that a step has completed successfully without issue. When called, `complete` requires you include an `outputs` object that matches your step definition in [`output_parameters`](#inputs-outputs).
`fail` | A utility method that invokes `functions.completeError`. True to its name, this method signals to Slack that a step has failed to complete. The `fail` method requires an argument of `error` to be sent along with it, which is used to help users understand what went wrong.
`inputs` | An alias for the `input_parameters` that were provided to the step upon execution.
@@ -255,7 +255,7 @@ When you're ready to deploy your steps for wider use, you'll need to decide *whe
### Control step access {#access}
-You can choose who has access to your custom steps. To define this, refer to the [custom function access](/automation/functions/access) page.
+You can choose who has access to your custom steps. To define this, refer to the [custom function access](/tools/deno-slack-sdk/guides/controlling-access-to-custom-functions) page.
### Distribution {#distribution}
@@ -268,5 +268,5 @@ Apps containing custom steps cannot be distributed publicly or submitted to the
## Related tutorials {#tutorials}
-* [Custom steps for Workflow Builder (new app)](/tutorial/custom-steps-WB-new)
-* [Custom steps for Workflow Builder (existing app)](/tutorial/custom-steps-WB-existing)
+* [Custom steps for Workflow Builder (new app)](/tools/bolt-python/tutorial/custom-steps-workflow-builder-new)
+* [Custom steps for Workflow Builder (existing app)](/tools/bolt-python/tutorial/custom-steps-workflow-builder-existing/)
\ No newline at end of file
diff --git a/docs/static/img/tutorials/modals/base_link.gif b/docs/english/tutorial/modals/base_link.gif
similarity index 100%
rename from docs/static/img/tutorials/modals/base_link.gif
rename to docs/english/tutorial/modals/base_link.gif
diff --git a/docs/static/img/tutorials/modals/final_product.gif b/docs/english/tutorial/modals/final_product.gif
similarity index 100%
rename from docs/static/img/tutorials/modals/final_product.gif
rename to docs/english/tutorial/modals/final_product.gif
diff --git a/docs/static/img/tutorials/modals/heart_icon.gif b/docs/english/tutorial/modals/heart_icon.gif
similarity index 100%
rename from docs/static/img/tutorials/modals/heart_icon.gif
rename to docs/english/tutorial/modals/heart_icon.gif
diff --git a/docs/static/img/tutorials/modals/interactivity_url.png b/docs/english/tutorial/modals/interactivity_url.png
similarity index 100%
rename from docs/static/img/tutorials/modals/interactivity_url.png
rename to docs/english/tutorial/modals/interactivity_url.png
diff --git a/docs/content/tutorial/modals.md b/docs/english/tutorial/modals/modals.md
similarity index 83%
rename from docs/content/tutorial/modals.md
rename to docs/english/tutorial/modals/modals.md
index b6d672d08..ee6d1e0d8 100644
--- a/docs/content/tutorial/modals.md
+++ b/docs/english/tutorial/modals/modals.md
@@ -1,4 +1,3 @@
-
# Modals
If you're learning about Slack apps, modals, or slash commands for the first time, you've come to the right place! In this tutorial, we'll take a look at setting up your very own server using GitHub Codespaces, then using that server to run your Slack app built with the [**Bolt for Python framework**](https://github.com/SlackAPI/bolt-python).
@@ -13,9 +12,9 @@ At the end of this tutorial, your final app will look like this:

And will make use of these Slack concepts:
-* [**Block Kit**](https://docs.slack.dev/block-kit/) is a UI framework for Slack apps that allows you to create beautiful, interactive messages within Slack. If you've ever seen a message in Slack with buttons or a select menu, that's Block Kit.
-* [**Modals**](https://docs.slack.dev/surfaces/modals) are a pop-up window that displays right in Slack. They grab the attention of the user, and are normally used to prompt users to provide some kind of information or input in a form.
-* [**Slash Commands**](https://docs.slack.dev/interactivity/implementing-slash-commands) allow you to invoke your app within Slack by just typing into the message composer box. e.g. `/remind`, `/topic`.
+* [**Block Kit**](/block-kit/) is a UI framework for Slack apps that allows you to create beautiful, interactive messages within Slack. If you've ever seen a message in Slack with buttons or a select menu, that's Block Kit.
+* [**Modals**](/surfaces/modals) are a pop-up window that displays right in Slack. They grab the attention of the user, and are normally used to prompt users to provide some kind of information or input in a form.
+* [**Slash Commands**](/interactivity/implementing-slash-commands) allow you to invoke your app within Slack by just typing into the message composer box. e.g. `/remind`, `/topic`.
If you're familiar with using Heroku you can also deploy directly to Heroku with the following button.
@@ -66,7 +65,7 @@ You'll need to create an app and configure it properly within App Settings befor
}
```
-2. Once your app has been created, scroll down to `App-Level Tokens` and create a token that requests for the [`connections:write`](https://docs.slack.dev/reference/scopes/connections.write) scope, which allows you to use [Socket Mode](https://docs.slack.dev/apis/events-api/using-socket-mode), a secure way to develop on Slack through the use of WebSockets. Copy the value of your app token and keep it for safe-keeping.
+2. Once your app has been created, scroll down to `App-Level Tokens` and create a token that requests for the [`connections:write`](/reference/scopes/connections.write) scope, which allows you to use [Socket Mode](/apis/events-api/using-socket-mode), a secure way to develop on Slack through the use of WebSockets. Copy the value of your app token and keep it for safe-keeping.
3. Install your app by heading to `Install App` in the left sidebar. Hit `Allow`, which means you're agreeing to install your app with the permissions that it is requesting. Be sure to copy the token that you receive, and keep it somewhere secret and safe.
@@ -132,4 +131,4 @@ All done! 🎉 You've created your first slash command using Block Kit and modal
## Next steps {#next-steps}
-If you want to learn more about Bolt for Python, refer to the [Getting Started guide](https://tools.slack.dev/bolt-python/getting-started).
\ No newline at end of file
+If you want to learn more about Bolt for Python, refer to the [Getting Started guide](https://docs.slack.dev/tools/bolt-python/getting-started).
\ No newline at end of file
diff --git a/docs/static/img/tutorials/modals/slash_command.png b/docs/english/tutorial/modals/slash_command.png
similarity index 100%
rename from docs/static/img/tutorials/modals/slash_command.png
rename to docs/english/tutorial/modals/slash_command.png
diff --git a/docs/footerConfig.js b/docs/footerConfig.js
deleted file mode 100644
index 6433c049d..000000000
--- a/docs/footerConfig.js
+++ /dev/null
@@ -1,21 +0,0 @@
-const footer = {
- links: [
- {
- items: [
- {
- html: `
-
-
- `,
- },
- ],
- },
- ],
-};
-
-module.exports = footer;
diff --git a/docs/i18n/ja-jp/README.md b/docs/i18n/ja-jp/README.md
deleted file mode 100644
index e23cb969b..000000000
--- a/docs/i18n/ja-jp/README.md
+++ /dev/null
@@ -1,121 +0,0 @@
-# Bolt for Python Japanese documentation
-
-This README describes how the Japanese documentation is created. Please read the [/docs README](./docs/README) for information on _all_ the documentation.
-
-[Docusaurus](https://docusaurus.io) supports using different languages. Each language is a different version of the same site. The English site is the default. The English page will be viewable if the page is not translated into Japanese.
-
-There will be English pages on the Japanese site for any non-translated pages. Japanese readers will not miss any content, but they may be confused seeing English and Japanese mixed together. Please give us your thoughts on this setup.
-
-Because of this, the sidebar does not need to be updated for the Japanese documentation. It's always the same as the English documentation!
-
-## Testing the Japanese site.
-
-Please read the [/docs README](./docs/README.md) for instructions. Be sure to run the site in Japanese:
-
-```
-npm run start -- --locale ja-jp
-```
-
----
-
-## Japanese documentation files
-
-```
-docs/
-├── content/
-│ ├── getting-started.md
-│ └── concepts
-│ └── sending-message.md
-├── i18n/ja-jp
-│ ├── code.json
-│ ├── docusaurus-theme-classic/
-│ │ ├── footer.json
-│ │ └── navbar.json
-│ └── docusaurus-plugin-content-docs/
-│ └── current/
-│ ├── getting-started.md
-│ └── concepts
-│ └── sending-message.md
-```
-
-The Japanese documentation is in `i18n/ja-jp/`. The folder contains `docusaurus-plugin-content-docs`, `docusaurus-theme-classic`, and `code.json`.
-
-### `docusaurus-plugin-content-docs`
-
-```
-docs/
-├── content/ (English pages)
-│ ├── example-page.md
-│ ├── getting-started.md
-│ └── concepts
-│ └── sending-message.md
-├── i18n/ja-jp
-│ └── docusaurus-plugin-content-docs/
-│ └── current/ (Japanese pages)
-│ ├── getting-started.md
-│ └── concepts
-│ └── sending-message.md
-```
-
-If the file is not in `i18n/ja-jp/docusaurus-plugin-content-docs/current/`, then the English file will be used. In the example above, `example-page.md` is not in `i18n/ja-jp/docusaurus-plugin-content-docs/current/`. Therefore, the English version of `example-page.md` will appear on the Japanese site.
-
-The Japanese page file formats in `i18n/ja-jp/docusaurus-plugin-content-docs/current/` must be the same as the English page files in `docs/content/`. Please keep the file names in English (example: `sending-message.md`).
-
-Please provide a title in Japanese. It will show up in the sidebar. There are two options:
-
-```
----
-title: こんにちは
----
-
-# こんにちは
-
-```
-
-[Read the Docusaurus documentation for info on writing pages in markdown](https://docusaurus.io/docs/markdown-features).
-
-### `docusaurus-theme-classic`
-
-```
-└── i18n/ja-jp
- └── docusaurus-theme-classic/
- ├── footer.json
- └── navbar.json
-```
-
-`docusaurus-theme-classic` You can translate site components (footer and navbar) for the Japanese site. Each JSON object has a `messages` and `description` value:
- * `message` - The Japanese translation. It will be in English if not translated.
- * `description` - What and where the message is. This stays in English.
-
-For example:
-
-```
-{
- "item.label.Hello": {
- "message": "こんにちは",
- "description": "The title of the page"
- }
-}
-```
-
-The JSON files are created with the `npm run write-translations -- --locale ja-jp` command. [Please read the Docusaurus documentation](https://docusaurus.io/docs/i18n/tutorial#translate-your-react-code) for more info.
-
-### `code.json`
-
-```
-└── i18n/ja-jp
- └── code.json
-```
-
-The `code.json` file is similar to `docusaurus-theme-classic` JSON objects. `code.json` has translations provided by Docusaurus for site elements.
-
-For example:
-
-```
- "theme.CodeBlock.copy": {
- "message": "コピー",
- "description": "The copy button label on code blocks"
- },
-```
-
-Be careful changing `code.json`. If you change something in this repo, it will likely need to be changed in the other tools.slack.dev repos too, like the Bolt-Python repo. We want these translations to match for all tools.slack.dev sites.
\ No newline at end of file
diff --git a/docs/i18n/ja-jp/code.json b/docs/i18n/ja-jp/code.json
deleted file mode 100644
index 2b3c80254..000000000
--- a/docs/i18n/ja-jp/code.json
+++ /dev/null
@@ -1,321 +0,0 @@
-{
- "theme.NotFound.title": {
- "message": "ページが見つかりません",
- "description": "The title of the 404 page"
- },
- "theme.NotFound.p1": {
- "message": "お探しのページが見つかりませんでした",
- "description": "The first paragraph of the 404 page"
- },
- "theme.NotFound.p2": {
- "message": "このページにリンクしているサイトの所有者にリンクが壊れていることを伝えてください",
- "description": "The 2nd paragraph of the 404 page"
- },
- "theme.ErrorPageContent.title": {
- "message": "エラーが発生しました",
- "description": "The title of the fallback page when the page crashed"
- },
- "theme.BackToTopButton.buttonAriaLabel": {
- "message": "先頭へ戻る",
- "description": "The ARIA label for the back to top button"
- },
- "theme.blog.archive.title": {
- "message": "アーカイブ",
- "description": "The page & hero title of the blog archive page"
- },
- "theme.blog.archive.description": {
- "message": "アーカイブ",
- "description": "The page & hero description of the blog archive page"
- },
- "theme.blog.paginator.navAriaLabel": {
- "message": "ブログ記事一覧のナビゲーション",
- "description": "The ARIA label for the blog pagination"
- },
- "theme.blog.paginator.newerEntries": {
- "message": "新しい記事",
- "description": "The label used to navigate to the newer blog posts page (previous page)"
- },
- "theme.blog.paginator.olderEntries": {
- "message": "過去の記事",
- "description": "The label used to navigate to the older blog posts page (next page)"
- },
- "theme.blog.post.paginator.navAriaLabel": {
- "message": "ブログ記事のナビゲーション",
- "description": "The ARIA label for the blog posts pagination"
- },
- "theme.blog.post.paginator.newerPost": {
- "message": "新しい記事",
- "description": "The blog post button label to navigate to the newer/previous post"
- },
- "theme.blog.post.paginator.olderPost": {
- "message": "過去の記事",
- "description": "The blog post button label to navigate to the older/next post"
- },
- "theme.blog.post.plurals": {
- "message": "{count}件",
- "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
- },
- "theme.blog.tagTitle": {
- "message": "「{tagName}」タグの記事が{nPosts}件あります",
- "description": "The title of the page for a blog tag"
- },
- "theme.tags.tagsPageLink": {
- "message": "全てのタグを見る",
- "description": "The label of the link targeting the tag list page"
- },
- "theme.colorToggle.ariaLabel": {
- "message": "ダークモードを切り替える(現在は{mode})",
- "description": "The ARIA label for the navbar color mode toggle"
- },
- "theme.colorToggle.ariaLabel.mode.dark": {
- "message": "ダークモード",
- "description": "The name for the dark color mode"
- },
- "theme.colorToggle.ariaLabel.mode.light": {
- "message": "ライトモード",
- "description": "The name for the light color mode"
- },
- "theme.docs.breadcrumbs.navAriaLabel": {
- "message": "パンくずリストのナビゲーション",
- "description": "The ARIA label for the breadcrumbs"
- },
- "theme.docs.DocCard.categoryDescription.plurals": {
- "message": "{count}項目",
- "description": "The default description for a category card in the generated index about how many items this category includes"
- },
- "theme.docs.paginator.navAriaLabel": {
- "message": "ドキュメントページ",
- "description": "The ARIA label for the docs pagination"
- },
- "theme.docs.paginator.previous": {
- "message": "前へ",
- "description": "The label used to navigate to the previous doc"
- },
- "theme.docs.paginator.next": {
- "message": "次へ",
- "description": "The label used to navigate to the next doc"
- },
- "theme.docs.tagDocListPageTitle.nDocsTagged": {
- "message": "{count}記事",
- "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
- },
- "theme.docs.tagDocListPageTitle": {
- "message": "「{tagName}」タグのついた{nDocsTagged}",
- "description": "The title of the page for a docs tag"
- },
- "theme.docs.versionBadge.label": {
- "message": "バージョン: {versionLabel}"
- },
- "theme.docs.versions.unreleasedVersionLabel": {
- "message": "これはリリース前のバージョン{versionLabel}の{siteTitle}のドキュメントです。",
- "description": "The label used to tell the user that he's browsing an unreleased doc version"
- },
- "theme.docs.versions.unmaintainedVersionLabel": {
- "message": "これはバージョン{versionLabel}の{siteTitle}のドキュメントで現在はメンテナンスされていません",
- "description": "The label used to tell the user that he's browsing an unmaintained doc version"
- },
- "theme.docs.versions.latestVersionSuggestionLabel": {
- "message": "最新のドキュメントは{latestVersionLink} ({versionLabel}) を見てください",
- "description": "The label used to tell the user to check the latest version"
- },
- "theme.docs.versions.latestVersionLinkLabel": {
- "message": "最新バージョン",
- "description": "The label used for the latest version suggestion link label"
- },
- "theme.common.editThisPage": {
- "message": "このページを編集",
- "description": "The link label to edit the current page"
- },
- "theme.lastUpdated.atDate": {
- "message": "{date}に",
- "description": "The words used to describe on which date a page has been last updated"
- },
- "theme.lastUpdated.byUser": {
- "message": "{user}が",
- "description": "The words used to describe by who the page has been last updated"
- },
- "theme.lastUpdated.lastUpdatedAtBy": {
- "message": "{atDate}{byUser}最終更新",
- "description": "The sentence used to display when a page has been last updated, and by who"
- },
- "theme.common.headingLinkTitle": {
- "message": "{heading} への直接リンク",
- "description": "Title for link to heading"
- },
- "theme.navbar.mobileVersionsDropdown.label": {
- "message": "他のバージョン",
- "description": "The label for the navbar versions dropdown on mobile view"
- },
- "theme.tags.tagsListLabel": {
- "message": "タグ:",
- "description": "The label alongside a tag list"
- },
- "theme.admonition.caution": {
- "message": "注意",
- "description": "The default label used for the Caution admonition (:::caution)"
- },
- "theme.admonition.danger": {
- "message": "危険",
- "description": "The default label used for the Danger admonition (:::danger)"
- },
- "theme.admonition.info": {
- "message": "備考",
- "description": "The default label used for the Info admonition (:::info)"
- },
- "theme.admonition.note": {
- "message": "注記",
- "description": "The default label used for the Note admonition (:::note)"
- },
- "theme.admonition.tip": {
- "message": "ヒント",
- "description": "The default label used for the Tip admonition (:::tip)"
- },
- "theme.admonition.warning": {
- "message": "警告",
- "description": "The default label used for the Warning admonition (:::warning)"
- },
- "theme.AnnouncementBar.closeButtonAriaLabel": {
- "message": "閉じる",
- "description": "The ARIA label for close button of announcement bar"
- },
- "theme.blog.sidebar.navAriaLabel": {
- "message": "最近のブログ記事のナビゲーション",
- "description": "The ARIA label for recent posts in the blog sidebar"
- },
- "theme.CodeBlock.copied": {
- "message": "コピーしました",
- "description": "The copied button label on code blocks"
- },
- "theme.CodeBlock.copyButtonAriaLabel": {
- "message": "クリップボードにコードをコピー",
- "description": "The ARIA label for copy code blocks button"
- },
- "theme.CodeBlock.copy": {
- "message": "コピー",
- "description": "The copy button label on code blocks"
- },
- "theme.CodeBlock.wordWrapToggle": {
- "message": "折り返し",
- "description": "The title attribute for toggle word wrapping button of code block lines"
- },
- "theme.DocSidebarItem.expandCategoryAriaLabel": {
- "message": "'{label}'の目次を開く",
- "description": "The ARIA label to expand the sidebar category"
- },
- "theme.DocSidebarItem.collapseCategoryAriaLabel": {
- "message": "'{label}'の目次を隠す",
- "description": "The ARIA label to collapse the sidebar category"
- },
- "theme.NavBar.navAriaLabel": {
- "message": "ナビゲーション",
- "description": "The ARIA label for the main navigation"
- },
- "theme.navbar.mobileLanguageDropdown.label": {
- "message": "他の言語",
- "description": "The label for the mobile language switcher dropdown"
- },
- "theme.TOCCollapsible.toggleButtonLabel": {
- "message": "このページの見出し",
- "description": "The label used by the button on the collapsible TOC component"
- },
- "theme.blog.post.readMore": {
- "message": "もっと見る",
- "description": "The label used in blog post item excerpts to link to full blog posts"
- },
- "theme.blog.post.readMoreLabel": {
- "message": "{title}についてもっと見る",
- "description": "The ARIA label for the link to full blog posts from excerpts"
- },
- "theme.blog.post.readingTime.plurals": {
- "message": "約{readingTime}分",
- "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
- },
- "theme.docs.breadcrumbs.home": {
- "message": "ホームページ",
- "description": "The ARIA label for the home page in the breadcrumbs"
- },
- "theme.docs.sidebar.collapseButtonTitle": {
- "message": "サイドバーを隠す",
- "description": "The title attribute for collapse button of doc sidebar"
- },
- "theme.docs.sidebar.collapseButtonAriaLabel": {
- "message": "サイドバーを隠す",
- "description": "The title attribute for collapse button of doc sidebar"
- },
- "theme.docs.sidebar.navAriaLabel": {
- "message": "ドキュメントのサイドバー",
- "description": "The ARIA label for the sidebar navigation"
- },
- "theme.docs.sidebar.closeSidebarButtonAriaLabel": {
- "message": "ナビゲーションバーを閉じる",
- "description": "The ARIA label for close button of mobile sidebar"
- },
- "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": {
- "message": "← メインメニューに戻る",
- "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"
- },
- "theme.docs.sidebar.toggleSidebarButtonAriaLabel": {
- "message": "ナビゲーションバーを開く",
- "description": "The ARIA label for hamburger menu button of mobile navigation"
- },
- "theme.docs.sidebar.expandButtonTitle": {
- "message": "サイドバーを開く",
- "description": "The ARIA label and title attribute for expand button of doc sidebar"
- },
- "theme.docs.sidebar.expandButtonAriaLabel": {
- "message": "サイドバーを開く",
- "description": "The ARIA label and title attribute for expand button of doc sidebar"
- },
- "theme.ErrorPageContent.tryAgain": {
- "message": "もう一度試してください",
- "description": "The label of the button to try again rendering when the React error boundary captures an error"
- },
- "theme.common.skipToMainContent": {
- "message": "メインコンテンツまでスキップ",
- "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"
- },
- "theme.tags.tagsPageTitle": {
- "message": "タグ",
- "description": "The title of the tag list page"
- },
- "theme.unlistedContent.title": {
- "message": "非公開のページ",
- "description": "The unlisted content banner title"
- },
- "theme.unlistedContent.message": {
- "message": "このページは非公開です。 検索対象外となり、このページのリンクに直接アクセスできるユーザーのみに公開されます。",
- "description": "The unlisted content banner message"
- },
- "theme.blog.author.pageTitle": {
- "message": "{authorName} - {nPosts}",
- "description": "The title of the page for a blog author"
- },
- "theme.blog.authorsList.pageTitle": {
- "message": "著者一覧",
- "description": "The title of the authors page"
- },
- "theme.blog.authorsList.viewAll": {
- "message": "すべての著者を見る",
- "description": "The label of the link targeting the blog authors page"
- },
- "theme.blog.author.noPosts": {
- "message": "この著者による投稿はまだありません。",
- "description": "The text for authors with 0 blog post"
- },
- "theme.contentVisibility.unlistedBanner.title": {
- "message": "非公開のページ",
- "description": "The unlisted content banner title"
- },
- "theme.contentVisibility.unlistedBanner.message": {
- "message": "このページは非公開です。 検索対象外となり、このページのリンクに直接アクセスできるユーザーのみに公開されます。",
- "description": "The unlisted content banner message"
- },
- "theme.contentVisibility.draftBanner.title": {
- "message": "下書きのページ",
- "description": "The draft content banner title"
- },
- "theme.contentVisibility.draftBanner.message": {
- "message": "このページは下書きです。開発環境でのみ表示され、本番環境のビルドには含まれません。",
- "description": "The draft content banner message"
- }
-}
diff --git a/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current.json b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current.json
deleted file mode 100644
index eb3b5be26..000000000
--- a/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current.json
+++ /dev/null
@@ -1,78 +0,0 @@
-{
- "version.label": {
- "message": "Next",
- "description": "The label for version current"
- },
- "sidebar.sidebarBoltPy.category.Basic concepts": {
- "message": "基本的な概念",
- "description": "The label for category Basic concepts in sidebar sidebarBoltPy"
- },
- "sidebar.sidebarBoltPy.category.Advanced concepts": {
- "message": "応用コンセプト",
- "description": "The label for category Advanced concepts in sidebar sidebarBoltPy"
- },
- "sidebar.sidebarBoltPy.category.steps from apps (Deprecated)": {
- "message": "ワークフローステップ 非推奨",
- "description": "The label for category steps from apps (Deprecated) in sidebar sidebarBoltPy"
- },
- "sidebar.sidebarBoltPy.category.Tutorials": {
- "message": "チュートリアル",
- "description": "The label for category Tutorials in sidebar sidebarBoltPy"
- },
- "sidebar.sidebarBoltPy.link.Code on GitHub": {
- "message": "Code on GitHub",
- "description": "The label for link Code on GitHub in sidebar sidebarBoltPy, linking to https://github.com/SlackAPI/bolt-python"
- },
- "sidebar.sidebarBoltPy.link.Contributors Guide": {
- "message": "貢献",
- "description": "The label for link Contributors Guide in sidebar sidebarBoltPy, linking to https://github.com/SlackAPI/bolt-python/blob/main/.github/contributing.md"
- },
- "sidebar.sidebarBoltPy.category.Guides": {
- "message": "ガイド",
- "description": "The label for category Guides in sidebar sidebarBoltPy"
- },
- "sidebar.sidebarBoltPy.category.Slack API calls": {
- "message": "Slack API コール",
- "description": "The label for category Slack API calls in sidebar sidebarBoltPy"
- },
- "sidebar.sidebarBoltPy.category.Events": {
- "message": "イベント API",
- "description": "The label for category Events in sidebar sidebarBoltPy"
- },
- "sidebar.sidebarBoltPy.category.App UI & Interactivity": {
- "message": "インタラクティビティ & ショートカット",
- "description": "The label for category App UI & Interactivity in sidebar sidebarBoltPy"
- },
- "sidebar.sidebarBoltPy.category.App Configuration": {
- "message": "App の設定",
- "description": "The label for category App Configuration in sidebar sidebarBoltPy"
- },
- "sidebar.sidebarBoltPy.category.Middleware & Context": {
- "message": "ミドルウェア & コンテキスト",
- "description": "The label for category Middleware & Context in sidebar sidebarBoltPy"
- },
- "sidebar.sidebarBoltPy.category.Adaptors": {
- "message": "アダプター",
- "description": "The label for category Adaptors in sidebar sidebarBoltPy"
- },
- "sidebar.sidebarBoltPy.category.Authorization & Security": {
- "message": "認可 & セキュリティ",
- "description": "The label for category Authorization & Security in sidebar sidebarBoltPy"
- },
- "sidebar.sidebarBoltPy.category.Legacy": {
- "message": "レガシー(非推奨)",
- "description": "The label for category Legacy in sidebar sidebarBoltPy"
- },
- "sidebar.sidebarBoltPy.link.Reference": {
- "message": "リファレンス",
- "description": "The label for link Reference in sidebar sidebarBoltPy, linking to https://tools.slack.dev/bolt-python/api-docs/slack_bolt/"
- },
- "sidebar.sidebarBoltPy.link.Release notes": {
- "message": "リリースノート",
- "description": "The label for link Release notes in sidebar sidebarBoltPy, linking to https://github.com/slackapi/bolt-python/releases"
- },
- "sidebar.sidebarBoltPy.doc.Bolt for Python": {
- "message": "Bolt for Python",
- "description": "The label for the doc item Bolt for Python in sidebar sidebarBoltPy, linking to the doc index"
- }
-}
diff --git a/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/concepts/app-home.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/concepts/app-home.md
deleted file mode 100644
index 2dc5fd6c0..000000000
--- a/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/concepts/app-home.md
+++ /dev/null
@@ -1,43 +0,0 @@
----
-title: ホームタブの更新
-lang: ja-jp
-slug: /concepts/app-home
----
-
-ホームタブは、サイドバーや検索画面からアクセス可能なサーフェスエリアです。アプリはこのエリアを使ってユーザーごとのビューを表示することができます。アプリ設定ページで App Home の機能を有効にすると、`views.publish` API メソッドの呼び出しで `user_id` と[ビューのペイロード](https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission)を指定して、ホームタブを公開・更新することができるようになります。
-
-`app_home_opened` イベントをサブスクライブすると、ユーザーが App Home を開く操作をリッスンできます。
-
-指定可能な引数の一覧はモジュールドキュメントを参考にしてください。
-```python
-@app.event("app_home_opened")
-def update_home_tab(client, event, logger):
- try:
- # 組み込みのクライアントを使って views.publish を呼び出す
- client.views_publish(
- # イベントに関連づけられたユーザー ID を使用
- user_id=event["user"],
- # アプリの設定で予めホームタブが有効になっている必要がある
- view={
- "type": "home",
- "blocks": [
- {
- "type": "section",
- "text": {
- "type": "mrkdwn",
- "text": "*Welcome home, <@" + event["user"] + "> :house:*"
- }
- },
- {
- "type": "section",
- "text": {
- "type": "mrkdwn",
- "text":"Learn how home tabs can be more useful and interactive ."
- }
- }
- ]
- }
- )
- except Exception as e:
- logger.error(f"Error publishing home tab: {e}")
-```
\ No newline at end of file
diff --git a/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/concepts/web-api.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/concepts/web-api.md
deleted file mode 100644
index 75953b5bd..000000000
--- a/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/concepts/web-api.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-title: Web API の使い方
-lang: ja-jp
-slug: /concepts/web-api
----
-
-`app.client`、またはミドルウェア・リスナーの引数 `client` として Bolt アプリに提供されている [`WebClient`](https://tools.slack.dev/python-slack-sdk/basic_usage.html) は必要な権限を付与されており、これを利用することで[あらゆる Web API メソッド](https://docs.slack.dev/reference/methods)を呼び出すことができます。このクライアントのメソッドを呼び出すと `SlackResponse` という Slack からの応答情報を含むオブジェクトが返されます。
-
-Bolt の初期化に使用するトークンは `context` オブジェクトに設定されます。このトークンは、多くの Web API メソッドを呼び出す際に必要となります。
-
-指定可能な引数の一覧はモジュールドキュメントを参考にしてください。
-```python
-@app.message("wake me up")
-def say_hello(client, message):
- # 2020 年 9 月 30 日午後 11:59:59 を示す Unix エポック秒
- when_september_ends = 1601510399
- channel_id = message["channel"]
- client.chat_scheduleMessage(
- channel=channel_id,
- post_at=when_september_ends,
- text="Summer has come and passed"
- )
-```
\ No newline at end of file
diff --git a/docs/i18n/ja-jp/docusaurus-theme-classic/footer.json b/docs/i18n/ja-jp/docusaurus-theme-classic/footer.json
deleted file mode 100644
index 5a2d1bc10..000000000
--- a/docs/i18n/ja-jp/docusaurus-theme-classic/footer.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "copyright": {
- "message": "