Repository: gradio-app/gradio
Pull request: unified release process
closes #4851.

This PR overhauls our versioning and release process, and unifies it across the JS and Python files/libraries.

---

 Before I explain this PR I just want to point out that change will increase the frequency with which you have to pull changes from a PR branch because the bot will be pushing to the PR. There should never be conflicts because it will only create `changeset` files (so `.changeset/something.md`) but you may get errors if you try to push and you have pulled when the bot has added a commit.
 
 In order to work around this, I recommend setting up some global git config to make pulling easier:

```sh
git config --global push.autosetupremote true # not required but is nice
git config --global push.default upstream
git config --global branch.autosetupmerge simple # i think this is the default
git config --global pull.rebase true # rebase pull is cleaner than merge
```

These settings will automatically setup up the tracking branch for you (as long as you are working off this repo). If you need to pull you'll just be able to `git pull` without tracking remote explicitly and you'll also be able to just `git push` instead of `git push origin whatever`. You don't _have_ to do this but it'll make life way easier. Being able to just `push` / `pull` is super nice.

---

There are quite a few moving parts in this PR (honestly it was a much more enormous amount of work than i expected), so I'll will explain what happens and then i will explain how.

**What does it do**

This PR introduces two distinct things: automatic versioning/ changelog generation/ release and automatic changeset generation. This will make sense in a sec.

Whenever we make a PR that requires a release (so any code change) instead of updating the changelog manually, we just add a `changeset` file that describe the change. The only information needed is:

- the package(s) that have changed
- the type of change (`patch`, `minor` or `major`)
- a description of the change (for the changelog, so friendly descriptions)
- the 'type' of change (`fix`, `feat`, `highlight`). This is to allow us to format our changelogs nicely for each releases. We can add more `types` if we thing they are necessary.

A changeset file looks like this:

```md
---
<package-name>: <patch|minor|major>
<package-name>: <patch|minor|major>
...
---
<fix|feat>: description
```

A changeset with a `highlight` type ha slightly different requirements:

```md
---
<package-name>: <patch|minor|major>
<package-name>: <patch|minor|major>
...
---
highlight: 

#### a title

some content
```

`highlight` types _must_ have a level 4 markdown heading on a separate line from the `highlight:` text. This looks nicer and is validated in CI.

When this file is added to a PR and that PR is merged, a robot will create a new 'release' PR this PR takes care of figuring our the correct version bump for each package based on the combined changesets file, it also generates a changelog from those changesets. It link the PR, the merge commit and thanks the user (with a link) in the change logs. Normal entries look like this:

```md
- [#1234](https//link.to.pr) [`abcd123`](https://link.to.ref) - The description of the change. Thanks [@user](https://link.to.user)!
```

Rendered:

> - [#1234](https://link.to.pr) [`abcd123`](https://link.to.ref) - The description of the change. Thanks [@user](https://link.to.user)!

highlight entries look like this:

```md
#### The description of the change / title ([#1234](https//link.to.pr) [`abcd123`](https://link.to.ref))

any content

Thanks [@user](https://link.to.user)!
```

Rendered:

> **The description of the change / title ([#1234](https://link.to.pr) [`abcd123`](https://link.to.ref))**
>
> any content
>
> Thanks [@user](https://link.to.user)!

This generated PR also bumps all of the version files (package.json + version.txt) and bumps the version of any local dependencies (so when `gradio_client` gets bumped, the `requirements.txt` of `gradio` gets bumped to match this version).

When we merged this PR, the second part of teh same CI workflow will see that the changesets have been removed + the version updated. It will then check that version does not exist, run any build scripts and release the package. Python packages are expected to have a `build_pypi.sh` script in their directory (we can move this to `scripts/` if needed).

`changesets` will also generate tags + github releases but I need to double check that is enabled.

The second part os the automatic changeset generation. Generating the changesets can be a bit tedious so we have a bot that does it for you. The bot does this:

- By default, it will check the changed packages, check any linked issues (closes #123) and generate the correct changeset based on that. If there are no release it will set the bump as `minor` and the type as `feat`.
- We can change the version and type with labels. `v: (patch|major|minor)` for the bump type and `t: (fix|feat|highlight)` for the 'type'.
- We can select the packages that should be affected if the bot is wrong. There is a PR comment that we can interact with to enter "manual package selection mode". Then we will get a checklist of all packages that we can choose from
- We can enter full manual mode byt editing the generated changeset file. The bot will stop doing stuff (other than updating the comment) if the changeset file has been edited manually.
- We can delete the changeset file and remove all labels to start again.

**How does it work**

**Changeset generation**

- When a PR is opened, reopened, synchronised, edited or labelled, or the issue generated by the job is edited a CI job runs. This job does nothing and only exists to trigger the action that does the work (`pull_request` event or `issues_edited` is the event used here).
- Another action (with the actual logic in it) will run when the above action has finished (`workflow_run` event). This is for security reasons. We need access to secrets to do anything but we don't want PRs from forks to have access to those secrets. `pull_request` evens do not expose secrets. This 'other' action runs in the context of main, so a PR would need to be merged any code within it could have any impact.
- This action figures out the PR via a reusbale action which can be found [here](https://github.com/gradio-app/github/tree/main/packages/get-pr-branch). This action uses the source repo + branch name and cross-references that with any open PRs to find the PR number.
- When it has the PR number, this is passed into the changeset generation / update action which is also reusable and can be found [here](https://github.com/gradio-app/github/tree/main/packages/generate-changeset). I can go through how this works if needed but there is a bit of complexity there.
- One difference between vanilla changesets and our version is how we handle dependencies. Pretty much any change we make should end up in the `gradio` changelog in order to be useful to users. This isn't typically how it works in JS. The default behaviour is for individual packages to contain their changelog (which is good) but for packages that depend on those packages to simple contain an 'dependencies updated' changelog entry (which is not very useful). So I have introduced a `main_changeset` field to the package.json of any package whose changelog should be added to the 'main' package, in this case `gradio`. What this mean is that if you change the `Plot` component's JS/Svelte code with a title of "ensure the plot uses the correct styling in dark mode" that description will be added to the `@gradio/plot` package (which is nice for us to keep track) but it will _also_ be added to the `gradio` package (which is nice for our users).

**Versioning**

- We build on top of changesets to do this, this is why i have added `package.json` files to the gradio libs, to kind of treat them as 'packages' (changesets only really works with npm packages).
- We follow the normal changesets flow with a few customisation. The changeset files we generate match what changesets expects, so we don't need to do anything clever there. All we really need to do is add a little metadata to introduce the concept of `type` (`fix`, `feat`, `highlight`). So when making PRs and merging them into `main` the flow is pretty consistent with the changesets documentation. 
- After we have merged into main we do a bunch of more custom stuff. There are two scripts that handle this. `./changeset/changeset.cjs` and `./changeset/fix_changelogs.cjs`. 
- changesets doesn't have an official API to create a custom changelog format, so we need to hack around it a bit.
- `./changeset/changeset.cjs` has a function or two that run for every 'release line', i.e. every changelog entry for each package. We do some github api lookups to get some details about a PR, parse the changeset file to see if it is a `fix`, `feat`, or `highlight` and then write those details to a JSON file. These function also return a string that becomes the new changelog for each package but we don't care about that because we overwrite them in the next step. 
- The above command runs as part of the `changeset version` command, which also bumps the JS packages. As we are storing the version for python packages in `package.json` files they get bumped correctly, however they are not in the correct place (`version.txt`), so we need to copy those new version into a few places to play nice with the python conventions. This is also when see if any python packages depend on another python package locally. In this case `gradio` depends on `gradio_client`. If `gradio_client` has been bumped, then we will update the `requirements.txt` of `gradio` to match this new version. This is because that is how we tests in CI, latest with latest, so that is what we pin to.
- This is _also_ where we reformat the changelogs to respect our custom format (which is with `Highlights`, "Features", and "Fixes" sections). We use the JSON file we saved earlier to know what has changed for each package.
- The `changesets` action  creates a descriptive PR message from the changelogs themselves, so this pretty much works without any intervention.

**Publishing**

This is also part of the 'changesets' CI job.

- The JS stuff 'just works' by default because that is what changesets does.
- The python stuff does not. We have some custom stuff to make that go.
- The logic lives in [this reusable action](https://github.com/gradio-app/github/tree/main/packages/publish-pypi). This is basically the same as the pypi action we used to use except faster (and not quite as feature rich). 
 - It checks that the version have not already been published. If they have it bails.
 - It runs the `build_pypi.sh` script that ever package is expected to have
 - It uploads the new version with `twine`
 - (I can go through this action in more detail if needed as well)

---

checklist for me as i go through.

- [x] change `pngwn/gradio` reference to ``gradio-app/gradio`
- [x] check all python modules have a build script in the correct place
- [x] remove the current changesets ci thing
- [ ] reformat existing changelogs (i'll explain this)
- [x] check all secrets (i think i named them the same but need to double check)
- [x] check all package names + package.json are correct
- [x] explain wtf this does and where everything is in this PR body

Problem statement:
The ability to not have all those extra image editing tools, only cropping
One of our users wants a cleaner image editing interface with only cropping. Is that possible?

unify release process
- [x] I have searched to see if a similar issue already exists.


**Is your feature request related to a problem? Please describe.**  
We currently have two ways to release changes to packages in the gradio repo causing confusion and generating friction. 

Python packages (`gradio` and `gradio_client`) have a manual release process with manual changelog updates. This requires contributors to create a PR before they can update the changelog and causes lots of conflicts due to the same file being modified in most PRs. We also duplicate the workflow, each package has their own.

The JS packages (`@gradio/client` and `@gradio/lite`) use `changesets` to manage release which is a little simpler, reduces conflicts, and has no duplication.

**Describe the solution you'd like**  

Use changesets for everything.

Hints from issue discussion:
Yes, set tools=“select” in the image input kwargs

On Thu, Feb 25, 2021 at 1:40 PM Abubakar Abid <notifications@github.com>
wrote:

> One of our users wants a cleaner image editing interface with only
> cropping. Is that possible?
>
> —
> You are receiving this because you are subscribed to this thread.
> Reply to this email directly, view it on GitHub
> <https://github.com/gradio-app/gradio/issues/123>, or unsubscribe
> <https://github.com/notifications/unsubscribe-auth/AB4BTHEXJXCKMMBSZGHMNHTTA27TNANCNFSM4YHI3JHQ>
> .
>

> Yes, set tools=“select” in the image input kwargs
> […](#)
> On Thu, Feb 25, 2021 at 1:40 PM Abubakar Abid ***@***.***> wrote: One of our users wants a cleaner image editing interface with only cropping. Is that possible? — You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub <#123>, or unsubscribe <https://github.com/notifications/unsubscribe-auth/AB4BTHEXJXCKMMBSZGHMNHTTA27TNANCNFSM4YHI3JHQ> .

`gr.inputs.Image(tool='select')` does not work in version 2.1.2.

Commit message: fix changelog

Patch to review:
diff --git a/.changeset/changeset.cjs b/.changeset/changeset.cjs
new file mode 100644
index 0000000000..82c24a2370
--- /dev/null
+++ b/.changeset/changeset.cjs
@@ -0,0 +1,260 @@
+const { getPackagesSync } = require("@manypkg/get-packages");
+const gh = require("@changesets/get-github-info");
+const { existsSync, readFileSync, writeFileSync } = require("fs");
+const { join } = require("path");
+
+const { getInfo, getInfoFromPullRequest } = gh;
+const { packages, rootDir } = getPackagesSync(process.cwd());
+
+/**
+ * @typedef {{packageJson: {name: string, python?: boolean}, dir: string}} Package
+ */
+
+/**
+ * @typedef {{summary: string, id: string, commit: string, releases: {name: string}}} Changeset
+ */
+
+/**
+ *
+ * @param {string} package_name
+ * @returns {[string, string|null]}
+ */
+function find_packages_dirs(package_name) {
+	/**
+	 * @type {Package | undefined}
+	 */
+	const _package = packages.find((p) => p.packageJson.name === package_name);
+	if (!_package) throw new Error(`Package ${package_name} not found`);
+	return [
+		_package.dir,
+		_package.packageJson.python ? join(_package.dir, "..") : null
+	];
+}
+
+const changelogFunctions = {
+	/**
+	 *
+	 * @param {Changeset[]} changesets
+	 * @param {any} dependenciesUpdated
+	 * @param {any} options
+	 * @returns
+	 */
+	getDependencyReleaseLine: async (
+		changesets,
+		dependenciesUpdated,
+		options
+	) => {
+		if (!options.repo) {
+			throw new Error(
+				'Please provide a repo to this changelog generator like this:\n"changelog": ["@changesets/changelog-github", { "repo": "org/repo" }]'
+			);
+		}
+		if (dependenciesUpdated.length === 0) return "";
+
+		const changesetLink = `- Updated dependencies [${(
+			await Promise.all(
+				changesets.map(async (cs) => {
+					if (cs.commit) {
+						let { links } = await getInfo({
+							repo: options.repo,
+							commit: cs.commit
+						});
+						return links.commit;
+					}
+				})
+			)
+		)
+			.filter((_) => _)
+			.join(", ")}]:`;
+
+		const updatedDepenenciesList = dependenciesUpdated.map(
+			/**
+			 *
+			 * @param {any} dependency
+			 * @returns
+			 */
+			(dependency) => `  - ${dependency.name}@${dependency.newVersion}`
+		);
+
+		return [changesetLink, ...updatedDepenenciesList].join("\n");
+	},
+	/**
+	 *
+	 * @param {{summary: string, id: string, commit: string, releases: {name: string}[]}} changeset
+	 * @param {any} type
+	 * @param {any} options
+	 * @returns
+	 */
+	getReleaseLine: async (changeset, type, options) => {
+		if (!options || !options.repo) {
+			throw new Error(
+				'Please provide a repo to this changelog generator like this:\n"changelog": ["@changesets/changelog-github", { "repo": "org/repo" }]'
+			);
+		}
+
+		let prFromSummary;
+		let commitFromSummary;
+		/**
+		 * @type {string[]}
+		 */
+		let usersFromSummary = [];
+
+		const replacedChangelog = changeset.summary
+			.replace(/^\s*(?:pr|pull|pull\s+request):\s*#?(\d+)/im, (_, pr) => {
+				let num = Number(pr);
+				if (!isNaN(num)) prFromSummary = num;
+				return "";
+			})
+			.replace(/^\s*commit:\s*([^\s]+)/im, (_, commit) => {
+				commitFromSummary = commit;
+				return "";
+			})
+			.replace(/^\s*(?:author|user):\s*@?([^\s]+)/gim, (_, user) => {
+				usersFromSummary.push(user);
+				return "";
+			})
+			.trim();
+
+		const [firstLine, ...futureLines] = replacedChangelog
+			.split("\n")
+			.map((l) => l.trimRight());
+
+		const links = await (async () => {
+			if (prFromSummary !== undefined) {
+				let { links } = await getInfoFromPullRequest({
+					repo: options.repo,
+					pull: prFromSummary
+				});
+				if (commitFromSummary) {
+					links = {
+						...links,
+						commit: `[\`${commitFromSummary}\`](https://github.com/${options.repo}/commit/${commitFromSummary})`
+					};
+				}
+				return links;
+			}
+			const commitToFetchFrom = commitFromSummary || changeset.commit;
+			if (commitToFetchFrom) {
+				let { links } = await getInfo({
+					repo: options.repo,
+					commit: commitToFetchFrom
+				});
+				return links;
+			}
+			return {
+				commit: null,
+				pull: null,
+				user: null
+			};
+		})();
+
+		const users =
+			usersFromSummary && usersFromSummary.length
+				? usersFromSummary
+						.map(
+							(userFromSummary) =>
+								`[@${userFromSummary}](https://github.com/${userFromSummary})`
+						)
+						.join(", ")
+				: links.user;
+
+		const prefix = [
+			links.pull === null ? "" : `${links.pull}`,
+			links.commit === null ? "" : `${links.commit}`
+		]
+			.join(" ")
+			.trim();
+
+		const suffix = users === null ? "" : ` Thanks ${users}!`;
+
+		/**
+		 * @typedef {{[key: string]: string[] | {dirs: [string, string|null], current_changelog: string, feat: {summary: string}[], fix: {summary: string}[], highlight: {summary: string}[]}}} ChangesetMeta
+		 */
+
+		/**
+		 * @type { ChangesetMeta & { _handled: string[] } }}
+		 */
+		let lines;
+		if (existsSync(join(rootDir, ".changeset", "_changelog.json"))) {
+			lines = JSON.parse(
+				readFileSync(join(rootDir, ".changeset", "_changelog.json"), "utf-8")
+			);
+		} else {
+			lines = {
+				_handled: []
+			};
+		}
+
+		if (lines._handled.includes(changeset.id)) {
+			return "done";
+		} else {
+			lines._handled.push(changeset.id);
+		}
+
+		changeset.releases.forEach((release) => {
+			if (!lines[release.name])
+				lines[release.name] = {
+					dirs: find_packages_dirs(release.name),
+					current_changelog: "",
+					feat: [],
+					fix: [],
+					highlight: []
+				};
+
+			const changelog_path = join(
+				//@ts-ignore
+				lines[release.name].dirs[1] || lines[release.name].dirs[0],
+				"CHANGELOG.md"
+			);
+
+			if (existsSync(changelog_path)) {
+				//@ts-ignore
+				lines[release.name].current_changelog = readFileSync(
+					changelog_path,
+					"utf-8"
+				)
+					.replace(`# ${release.name}`, "")
+					.trim();
+			}
+
+			const [, _type, summary] = changeset.summary
+				.trim()
+				.match(/^(feat|fix|highlight)\s*:\s*([^]*)/im) || [
+				,
+				false,
+				changeset.summary
+			];
+
+			let formatted_summary = "";
+
+			if (_type === "highlight") {
+				const [heading, ...rest] = summary.trim().split("\n");
+				const _heading = `${heading} ${prefix ? `(${prefix})` : ""}`;
+				const _rest = rest.concat(["", suffix]);
+
+				formatted_summary = `${_heading}\n${_rest.join("\n")}`;
+			} else {
+				formatted_summary = `${prefix ? `${prefix} -` : ""} ${summary.replace(
+					/[\s\.]$/,
+					""
+				)}.${suffix}`;
+			}
+
+			//@ts-ignore
+			lines[release.name][_type].push({
+				summary: formatted_summary
+			});
+		});
+
+		writeFileSync(
+			join(rootDir, ".changeset", "_changelog.json"),
+			JSON.stringify(lines, null, 2)
+		);
+
+		return `\n\n-${prefix ? `${prefix} -` : ""} ${firstLine}\n${futureLines
+			.map((l) => `  ${l}`)
+			.join("\n")}`;
+	}
+};
+
+module.exports = changelogFunctions;
diff --git a/.changeset/config.json b/.changeset/config.json
index d530d250b9..d2ba85f6bb 100644
--- a/.changeset/config.json
+++ b/.changeset/config.json
@@ -1,14 +1,11 @@
 {
 	"$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json",
-	"changelog": [
-		"@changesets/changelog-github",
-		{ "repo": "gradio-app/gradio" }
-	],
+	"changelog": ["./changeset.cjs", { "repo": "gradio-app/gradio" }],
 	"commit": false,
 	"fixed": [],
 	"linked": [],
 	"access": "public",
 	"baseBranch": "main",
 	"updateInternalDependencies": "patch",
-	"ignore": ["@gradio/app", "@gradio/spaces-test"]
+	"ignore": ["@gradio/spaces-test", "@gradio/cdn-test"]
 }
diff --git a/.changeset/fix_changelogs.cjs b/.changeset/fix_changelogs.cjs
new file mode 100644
index 0000000000..8056119d39
--- /dev/null
+++ b/.changeset/fix_changelogs.cjs
@@ -0,0 +1,111 @@
+const { join } = require("path");
+const { readFileSync, existsSync, writeFileSync, unlinkSync } = require("fs");
+const { getPackagesSync } = require("@manypkg/get-packages");
+
+const RE_PKG_NAME = /^[\w-]+\b/;
+const pkg_meta = getPackagesSync(process.cwd());
+
+/**
+ * @typedef {{dirs: string[], highlight: {summary: string}[], feat: {summary: string}[], fix: {summary: string}[], current_changelog: string}} ChangesetMeta
+ */
+
+/**
+ * @typedef {{[key: string]: ChangesetMeta}} ChangesetMetaCollection
+ */
+
+/**
+ * @type { ChangesetMetaCollection & { _handled: string[] } }}
+ */
+const { _handled, ...packages } = JSON.parse(
+	readFileSync(join(pkg_meta.rootDir, ".changeset", "_changelog.json"), "utf-8")
+);
+
+/**
+ * @typedef { {packageJson: {name: string, version: string, python: boolean}, dir: string} } PackageMeta
+ */
+
+/**
+ * @type { {[key:string]: PackageMeta} }
+ */
+const all_packages = pkg_meta.packages.reduce((acc, pkg) => {
+	acc[pkg.packageJson.name] = /**@type {PackageMeta} */ (
+		/** @type {unknown} */ (pkg)
+	);
+	return acc;
+}, /** @type {{[key:string] : PackageMeta}} */ ({}));
+
+for (const pkg_name in packages) {
+	const { dirs, highlight, feat, fix, current_changelog } =
+		/**@type {ChangesetMeta} */ (packages[pkg_name]);
+
+	const { version, python } = all_packages[pkg_name].packageJson;
+
+	const highlights = highlight.map((h) => `${h.summary}`);
+	const features = feat.map((f) => `- ${f.summary}`);
+	const fixes = fix.map((f) => `- ${f.summary}`);
+
+	const release_notes = /** @type {[string[], string][]} */ ([
+		[highlights, "### Highlights"],
+		[features, "### Features"],
+		[fixes, "### Fixes"]
+	])
+		.filter(([s], i) => s.length > 0)
+		.map(([lines, title]) => {
+			if (title === "### Highlights") {
+				return `${title}\n\n${lines.join("\n\n")}`;
+			} else {
+				return `${title}\n\n${lines.join("\n")}`;
+			}
+		})
+		.join("\n\n");
+
+	const new_changelog = `# ${pkg_name}
+
+## ${version}
+
+${release_notes}
+
+${current_changelog.replace(`# ${pkg_name}`, "").trim()}
+`.trim();
+
+	dirs.forEach((dir) => {
+		writeFileSync(join(dir, "CHANGELOG.md"), new_changelog);
+	});
+
+	if (python) {
+		writeFileSync(join(dirs[0], "version.txt"), version);
+		bump_local_dependents(pkg_name, version);
+	}
+}
+
+unlinkSync(join(pkg_meta.rootDir, ".changeset", "_changelog.json"));
+
+/**
+ * @param {string} pkg_to_bump
+ * @param {string} version
+ * @returns {void}
+ * */
+function bump_local_dependents(pkg_to_bump, version) {
+	for (const pkg_name in all_packages) {
+		const {
+			dir,
+			packageJson: { python }
+		} = all_packages[pkg_name];
+
+		if (!python) continue;
+
+		const requirements_path = join(dir, "..", "requirements.txt");
+		const requirements = readFileSync(requirements_path, "utf-8").split("\n");
+
+		const pkg_index = requirements.findIndex((line) => {
+			const m = line.trim().match(RE_PKG_NAME);
+			if (!m) return false;
+			return m[0] === pkg_to_bump;
+		});
+
+		if (pkg_index !== -1) {
+			requirements[pkg_index] = `${pkg_to_bump}>=${version}`;
+			writeFileSync(requirements_path, requirements.join("\n"));
+		}
+	}
+}
diff --git a/.config/eslint.config.js b/.config/eslint.config.js
index 1e58f4d829..49c3502a0d 100644
--- a/.config/eslint.config.js
+++ b/.config/eslint.config.js
@@ -55,9 +55,24 @@ export default [
 			"js/app/test/**/*"
 		]
 	},
+	{
+		files: ["**/*.js", "**/*.cjs"],
+		languageOptions: {
+			globals: {
+				...browser,
+				...es2021,
+				...node
+			}
+		},
+
+		plugins: {
+			"eslint:recommended": js_plugin
+		},
+		rules
+	},
 
 	{
-		files: ["**/*.ts", "**/*.js", "**/*.cjs"],
+		files: ["**/*.ts"],
 		languageOptions: {
 			parser: typescriptParser,
 			parserOptions: {
diff --git a/.github/workflows/generate-changeset.yml b/.github/workflows/generate-changeset.yml
new file mode 100644
index 0000000000..169c55b5b7
--- /dev/null
+++ b/.github/workflows/generate-changeset.yml
@@ -0,0 +1,38 @@
+name: Generate changeset
+on:
+  workflow_run:
+    workflows: ["trigger changeset generation"]
+    types:
+      - completed
+
+env:
+  CI: true
+  NODE_OPTIONS: "--max-old-space-size=4096"
+
+concurrency:
+  group: ${{ github.event.workflow_run.head_repository.full_name }}::${{ github.event.workflow_run.head_branch }}
+
+jobs:
+  version:
+    permissions: write-all
+    name: static checks
+    runs-on: ubuntu-22.04
+    if: (github.event.workflow_run.head_repository.full_name == 'gradio-app/gradio' && github.event.workflow_run.head_branch != 'main') || github.event.workflow_run.head_repository.full_name != 'gradio-app/gradio'
+    steps:
+      - id: 'get-pr'
+        uses: "gradio-app/github/actions/get-pr-branch@main"
+        with:
+          github_token: ${{ secrets.GITHUB_TOKEN }}
+      - name: get pr number
+        run: echo "PR number is ${{ steps.get-pr.outputs.pr_number }}"
+      - uses: actions/checkout@v3
+        with:
+          repository: ${{ github.event.workflow_run.head_repository.full_name }}
+          ref: ${{ github.event.workflow_run.head_branch }}
+          fetch-depth: 0
+      - name: generate changeset
+        uses: "gradio-app/github/actions/generate-changeset@main"
+        with: 
+          github_token: ${{ secrets.PAT }}
+          main_pkg: gradio
+          pr_number: ${{ steps.get-pr.outputs.pr_number }}
\ No newline at end of file
diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml
index 70750c6391..7fb363e4ea 100644
--- a/.github/workflows/publish-npm.yml
+++ b/.github/workflows/publish-npm.yml
@@ -9,10 +9,10 @@ env:
   PNPM_CACHE_FOLDER: .pnpm-store
   NODE_OPTIONS: "--max-old-space-size=4096"
 jobs:
-  version:
-    runs-on: ubuntu-latest
+  version_or_publish:
+    runs-on: ubuntu-22.04
     steps:
-      - name: checkout code repository
+      - name: checkout repo
         uses: actions/checkout@v3
         with:
           fetch-depth: 0
@@ -42,9 +42,11 @@ jobs:
           NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
           NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
           GITHUB_TOKEN: ${{ secrets.GRADIO_PAT }}
-      - name: label PR
-        if: ${{ steps.changesets.outputs.pullRequestNumber != '' && steps.changesets.outputs.pullRequestNumber != 'undefined' }}
-        run: gh pr edit "$PR_NUMBER" --add-label "no-changelog-update" 
-        env:
-          PR_NUMBER: ${{ steps.changesets.outputs.pullRequestNumber }}
-          GITHUB_TOKEN: ${{ secrets.GRADIO_PAT }} # Not sure if this one is required
\ No newline at end of file
+      - name: publish to pypi
+        if: steps.changesets.outputs.hasChangesets != 'true'
+        uses: "gradio-app/github/actions/publish-pypi@main"
+        with:
+          user: __token__
+          passwords: |
+            gradio-test-pypi:${{ secrets.PYPI_API_TOKEN }}
+            gradio-test-client-pypi:${{ secrets.PYPI_GRADIO_CLIENT_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/trigger-changeset.yml b/.github/workflows/trigger-changeset.yml
new file mode 100644
index 0000000000..ba33df080c
--- /dev/null
+++ b/.github/workflows/trigger-changeset.yml
@@ -0,0 +1,16 @@
+name: trigger changeset generation
+on:
+  pull_request:
+    types: [opened, synchronize, reopened, edited, labeled, unlabeled]
+    branches:
+      - main
+  issue_comment:
+    types: [edited]
+
+jobs:
+  version:
+    permissions: write-all
+    name: static checks
+    runs-on: ubuntu-22.04
+    steps:
+      - run: echo "Triggering changeset generation"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index edc77b877a..cdb162d6f4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,24 +1,8 @@
-# Upcoming Release
+# gradio
 
-## New Features:
+## 3.38
 
-No changes to highlight.
-
-## Bug Fixes:
-
-No changes to highlight.
-
-## Breaking Changes:
-
-No changes to highlight.
-
-## Other Changes:
-
-No changes to highlight.
-
-# Version 3.38
-
-## New Features:
+### New Features:
 
 - Provide a parameter `animate` (`False` by default) in `gr.make_waveform()` which animates the overlayed waveform by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 4918](https://github.com/gradio-app/gradio/pull/4918)
 - Add `show_download_button` param to allow the download button in static Image components to be hidden by [@hannahblair](https://github.com/hannahblair) in [PR 4959](https://github.com/gradio-app/gradio/pull/4959)
@@ -26,24 +10,24 @@ No changes to highlight.
 - The `gr.ChatInterface` UI now converts the "Submit" button to a "Stop" button in ChatInterface while streaming, which can be used to pause generation. By [@abidlabs](https://github.com/abidlabs) in [PR 4971](https://github.com/gradio-app/gradio/pull/4971).
 - Add a `border_color_accent_subdued` theme variable to add a subdued border color to accented items. This is used by chatbot user messages. Set the value of this variable in `Default` theme to `*primary_200`. By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4989](https://github.com/gradio-app/gradio/pull/4989)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixes `cancels` for generators so that if a generator is canceled before it is complete, subsequent runs of the event do not continue from the previous iteration, but rather start from the beginning. By [@abidlabs](https://github.com/abidlabs) in [PR 4969](https://github.com/gradio-app/gradio/pull/4969).
 - Use `gr.State` in `gr.ChatInterface` to reduce latency by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4976](https://github.com/gradio-app/gradio/pull/4976)
 - Fix bug with `gr.Interface` where component labels inferred from handler parameters were including special args like `gr.Request` or `gr.EventData`. By [@cbensimon](https://github.com/cbensimon) in [PR 4956](https://github.com/gradio-app/gradio/pull/4956)
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Other Changes:
+### Other Changes:
 
 - Apply pyright to the `components` directory by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4948](https://github.com/gradio-app/gradio/pull/4948)
 - Improved look of ChatInterface by [@aliabid94](https://github.com/aliabid94) in [PR 4978](https://github.com/gradio-app/gradio/pull/4978) 
 
-# Version 3.37
+## 3.37
 
-## New Features:
+### New Features:
 
 Introducing a new `gr.ChatInterface` abstraction, which allows Gradio users to build fully functioning Chat interfaces very easily. The only required parameter is a chat function `fn`, which accepts a (string) user input `message` and a (list of lists) chat `history` and returns a (string) response. Here's a toy example:
 
@@ -89,7 +73,7 @@ demo.launch()
 
 - Added the support for the new command `gradio environment`to make it easier for people to file bug reports if we shipped an easy command to list the OS, gradio version, and versions of gradio/gradio-client dependencies. bu [@varshneydevansh](https://github.com/varshneydevansh) in [PR 4915](https://github.com/gradio-app/gradio/pull/4915).
 
-## Bug Fixes:
+### Bug Fixes:
 
 * The `.change()` event is fixed in `Video` and `Image` so that it only fires once by [@abidlabs](https://github.com/abidlabs) in [PR 4793](https://github.com/gradio-app/gradio/pull/4793)
 * The `.change()` event is fixed in `Audio` so that fires when the component value is programmatically updated by [@abidlabs](https://github.com/abidlabs) in [PR 4793](https://github.com/gradio-app/gradio/pull/4793)
@@ -99,38 +83,38 @@ demo.launch()
 - Fixed `gr.Group` and `container=False`. `container` parameter only available for `Textbox`, `Number`, and `Dropdown`, the only elements where it makes sense. By [@aliabid94](https://github.com/aliabid94) in [PR 4916](https://github.com/gradio-app/gradio/pull/4916)
 - Fixed broken image link in auto-generated `app.py` from `ThemeClass.push_to_hub` by [@deepkyu](https://github.com/deepkyu) in [PR 4944](https://github.com/gradio-app/gradio/pull/4944)
 
-## Other Changes:
+### Other Changes:
 
 - Warning on mobile that if a user leaves the tab, websocket connection may break. On broken connection, tries to rejoin queue and displays error conveying connection broke. By [@aliabid94](https://github.com/aliabid94) in [PR 4742](https://github.com/gradio-app/gradio/pull/4742)
 - Remove blocking network calls made before the local URL gets printed - these slow down the display of the local URL, especially when no internet is available. [@aliabid94](https://github.com/aliabid94) in [PR 4905](https://github.com/gradio-app/gradio/pull/4905).
 - Pinned dependencies to major versions to reduce the likelihood of a broken `gradio` due to changes in downstream dependencies by [@abidlabs](https://github.com/abidlabs) in [PR 4885](https://github.com/gradio-app/gradio/pull/4885)
 - Queue `max_size` defaults to parent Blocks `max_thread` when running on Spaces with ZeroGPU hardware. By [@cbensimon](https://github.com/cbensimon) in [PR 4937](https://github.com/gradio-app/gradio/pull/4937)
 
-## Breaking Changes:
+### Breaking Changes:
 
 Motivated by the release of `pydantic==2.0`, which included breaking changes that broke a large number of Gradio apps, we've pinned many gradio dependencies. Note that pinned dependencies can cause downstream conflicts, so this may be a breaking change. That being said, we've kept the pins pretty loose, and we're expecting change to be better for the long-term stability of Gradio apps.
 
-# Version 3.36.1
+## 3.36.1
 
-## New Features:
+### New Features:
 
 - Hotfix to support pydantic v1 and v2 by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4835](https://github.com/gradio-app/gradio/pull/4835)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fix bug where `gr.File` change event was not triggered when the value was changed by another event by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4811](https://github.com/gradio-app/gradio/pull/4811)
 
-## Other Changes:
+### Other Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-# Version 3.36.0
+## 3.36.0
 
-## New Features:
+### New Features:
 
 - The `gr.Video`, `gr.Audio`, `gr.Image`, `gr.Chatbot`, and `gr.Gallery` components now include a share icon when deployed on Spaces. This behavior can be modified by setting the `show_share_button` parameter in the component classes. by [@aliabid94](https://github.com/aliabid94) in [PR 4651](https://github.com/gradio-app/gradio/pull/4651)
 - Allow the web component `space`, `src`, and `host` attributes to be updated dynamically by [@pngwn](https://github.com/pngwn) in [PR 4461](https://github.com/gradio-app/gradio/pull/4461)
@@ -138,7 +122,7 @@ No changes to highlight.
 - The `api_name` parameter now accepts `False` as a value, which means it does not show up in named or unnamed endpoints. By [@abidlabs](https://github.com/aliabid94) in [PR 4683](https://github.com/gradio-app/gradio/pull/4683)
 - Added support for `pathlib.Path` in `gr.Video`, `gr.Gallery`, and `gr.Chatbot` by [sunilkumardash9](https://github.com/sunilkumardash9) in [PR 4581](https://github.com/gradio-app/gradio/pull/4581).
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Updated components with `info` attribute to update when `update()` is called on them.  by [@jebarpg](https://github.com/jebarpg) in [PR 4715](https://github.com/gradio-app/gradio/pull/4715).
 - Ensure the `Image` components undo button works mode is `mask` or `color-sketch` by [@amyorz](https://github.com/AmyOrz) in [PR 4692](https://github.com/gradio-app/gradio/pull/4692)
@@ -170,7 +154,7 @@ No changes to highlight.
 - Fix regressed styling of Login page when auth is enabled by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4797](https://github.com/gradio-app/gradio/pull/4797)
 - Prevent broken scrolling to output on Spaces by [@aliabid94](https://github.com/aliabid94) in [PR 4822](https://github.com/gradio-app/gradio/pull/4822)
 
-## Other Changes:
+### Other Changes:
 
 - Add `.git-blame-ignore-revs` by [@akx](https://github.com/akx) in [PR 4586](https://github.com/gradio-app/gradio/pull/4586)
 - Update frontend dependencies in [PR 4601](https://github.com/gradio-app/gradio/pull/4601)
@@ -183,51 +167,51 @@ No changes to highlight.
 - Better message when share link is not created by [@abidlabs](https://github.com/abidlabs) in [PR 4773](https://github.com/gradio-app/gradio/pull/4773).
 - Improve accessibility around selected images in gr.Gallery component by [@hannahblair](https://github.com/hannahblair) in [PR 4790](https://github.com/gradio-app/gradio/pull/4790)
 
-## Breaking Changes:
+### Breaking Changes:
 
 [PR 4683](https://github.com/gradio-app/gradio/pull/4683) removes the explict named endpoint "load_examples" from gr.Interface that was introduced in [PR 4456](https://github.com/gradio-app/gradio/pull/4456).
 
-# Version 3.35.2
+## 3.35.2
 
-## New Features:
+### New Features:
 
 No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fix chatbot streaming by [@aliabid94](https://github.com/aliabid94) in [PR 4537](https://github.com/gradio-app/gradio/pull/4537)
 - Fix chatbot height and scrolling by [@aliabid94](https://github.com/aliabid94) in [PR 4540](https://github.com/gradio-app/gradio/pull/4540)
 
-## Other Changes:
+### Other Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-# Version 3.35.1
+## 3.35.1
 
-## New Features:
+### New Features:
 
 No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fix chatbot streaming by [@aliabid94](https://github.com/aliabid94) in [PR 4537](https://github.com/gradio-app/gradio/pull/4537)
 - Fix error modal position and text size by [@pngwn](https://github.com/pngwn) in [PR 4538](https://github.com/gradio-app/gradio/pull/4538).
 
-## Other Changes:
+### Other Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-# Version 3.35.0
+## 3.35.0
 
-## New Features:
+### New Features:
 
 - A `gr.ClearButton` which allows users to easily clear the values of components by [@abidlabs](https://github.com/abidlabs) in [PR 4456](https://github.com/gradio-app/gradio/pull/4456)
 
@@ -266,7 +250,7 @@ def start_process(name):
 ```
 
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Add support for PAUSED state in the JS client by [@abidlabs](https://github.com/abidlabs) in [PR 4438](https://github.com/gradio-app/gradio/pull/4438)
 - Ensure Tabs only occupy the space required by [@pngwn](https://github.com/pngwn) in [PR 4419](https://github.com/gradio-app/gradio/pull/4419)
@@ -282,7 +266,7 @@ def start_process(name):
 - `gr.BarPlot` group text now respects darkmode by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4531](https://github.com/gradio-app/gradio/pull/4531)
 - Fix dispatched errors from within components [@aliabid94](https://github.com/aliabid94) in [PR 4786](https://github.com/gradio-app/gradio/pull/4786)
 
-## Other Changes:
+### Other Changes:
 
 - Change styling of status and toast error components by [@hannahblair](https://github.com/hannahblair) in [PR 4454](https://github.com/gradio-app/gradio/pull/4454).
 - Clean up unnecessary `new Promise()`s by [@akx](https://github.com/akx) in [PR 4442](https://github.com/gradio-app/gradio/pull/4442).
@@ -292,19 +276,19 @@ def start_process(name):
 - The API endpoint that loads examples upon click has been given an explicit name ("/load_examples") by [@abidlabs](https://github.com/abidlabs) in [PR 4456](https://github.com/gradio-app/gradio/pull/4456).
 - Allows configuration of FastAPI app when calling `mount_gradio_app`, by [@charlesfrye](https://github.com/charlesfrye) in [PR4519](https://github.com/gradio-app/gradio/pull/4519).
 
-## Breaking Changes:
+### Breaking Changes:
 
 - The behavior of the `Clear` button has been changed for `Slider`, `CheckboxGroup`, `Radio`, `Dropdown` components by [@abidlabs](https://github.com/abidlabs) in [PR 4456](https://github.com/gradio-app/gradio/pull/4456). The Clear button now sets the value of these components to be empty as opposed to the original default set by the developer. This is to make them in line with the rest of the Gradio components.
 - Python 3.7 end of life is June 27 2023. Gradio will no longer support python 3.7 by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4484](https://github.com/gradio-app/gradio/pull/4484)
 - Removed `$` as a default LaTeX delimiter for the `Chatbot` by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 4516](https://github.com/gradio-app/gradio/pull/4516). The specific LaTeX delimeters can be set using the new `latex_delimiters` parameter in `Chatbot`.
 
-# Version 3.34.0
+## 3.34.0
 
-## New Features:
+### New Features:
 
 - The `gr.UploadButton` component now supports the `variant` and `interactive` parameters by [@abidlabs](https://github.com/abidlabs) in [PR 4436](https://github.com/gradio-app/gradio/pull/4436).
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Remove target="\_blank" override on anchor tags with internal targets by [@hannahblair](https://github.com/hannahblair) in [PR 4405](https://github.com/gradio-app/gradio/pull/4405)
 - Fixed bug where `gr.File(file_count='multiple')` could not be cached as output by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4421](https://github.com/gradio-app/gradio/pull/4421)
@@ -315,44 +299,44 @@ def start_process(name):
 - Fix video rendering in Safari by [@aliabid94](https://github.com/aliabid94) in [PR 4433](https://github.com/gradio-app/gradio/pull/4433).
 - The output directory for files downloaded when calling Blocks as a function is now set to a temporary directory by default (instead of the working directory in some cases) by [@abidlabs](https://github.com/abidlabs) in [PR 4501](https://github.com/gradio-app/gradio/pull/4501)
 
-## Other Changes:
+### Other Changes:
 
 - When running on Spaces, handler functions will be transformed by the [PySpaces](https://pypi.org/project/spaces/) library in order to make them work with specific hardware. It will have no effect on standalone Gradio apps or regular Gradio Spaces and can be globally deactivated as follows : `import spaces; spaces.disable_gradio_auto_wrap()` by [@cbensimon](https://github.com/cbensimon) in [PR 4389](https://github.com/gradio-app/gradio/pull/4389).
 - Deprecated `.style` parameter and moved arguments to constructor. Added support for `.update()` to all arguments initially in style. Added `scale` and `min_width` support to every Component. By [@aliabid94](https://github.com/aliabid94) in [PR 4374](https://github.com/gradio-app/gradio/pull/4374)
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-# Version 3.33.1
+## 3.33.1
 
-## New Features:
+### New Features:
 
 No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Allow `every` to work with generators by [@dkjshk](https://github.com/dkjshk) in [PR 4434](https://github.com/gradio-app/gradio/pull/4434)
 - Fix z-index of status component by [@hannahblair](https://github.com/hannahblair) in [PR 4429](https://github.com/gradio-app/gradio/pull/4429)
 - Allow gradio to work offline, by [@aliabid94](https://github.com/aliabid94) in [PR 4398](https://github.com/gradio-app/gradio/pull/4398).
 - Fixed `validate_url` to check for 403 errors and use a GET request in place of a HEAD by [@alvindaiyan](https://github.com/alvindaiyan) in [PR 4388](https://github.com/gradio-app/gradio/pull/4388).
 
-## Other Changes:
+### Other Changes:
 
 - More explicit error message when share link binary is blocked by antivirus by [@abidlabs](https://github.com/abidlabs) in [PR 4380](https://github.com/gradio-app/gradio/pull/4380).
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-# Version 3.33.0
+## 3.33.0
 
-## New Features:
+### New Features:
 
 - Introduced `gradio deploy` to launch a Gradio app to Spaces directly from your terminal. By [@aliabid94](https://github.com/aliabid94) in [PR 4033](https://github.com/gradio-app/gradio/pull/4033).
 - Introduce `show_progress='corner'` argument to event listeners, which will not cover the output components with the progress animation, but instead show it in the corner of the components. By [@aliabid94](https://github.com/aliabid94) in [PR 4396](https://github.com/gradio-app/gradio/pull/4396).
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fix bug where Label change event was triggering itself by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4371](https://github.com/gradio-app/gradio/pull/4371)
 - Make `Blocks.load` behave like other event listeners (allows chaining `then` off of it) [@anentropic](https://github.com/anentropic/) in [PR 4304](https://github.com/gradio-app/gradio/pull/4304)
@@ -364,23 +348,23 @@ No changes to highlight.
 - Replace default `markedjs` sanitize function with DOMPurify sanitizer for `gr.Chatbot()` by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 4360](https://github.com/gradio-app/gradio/pull/4360)
 - Prevent the creation of duplicate copy buttons in the chatbot and ensure copy buttons work in non-secure contexts by [@binary-husky](https://github.com/binary-husky) in [PR 4350](https://github.com/gradio-app/gradio/pull/4350).
 
-## Other Changes:
+### Other Changes:
 
 - Remove flicker of loading bar by adding opacity transition, by [@aliabid94](https://github.com/aliabid94) in [PR 4349](https://github.com/gradio-app/gradio/pull/4349).
 - Performance optimization in the frontend's Blocks code by [@akx](https://github.com/akx) in [PR 4334](https://github.com/gradio-app/gradio/pull/4334)
 - Upgrade the pnpm lock file format version from v6.0 to v6.1 by [@whitphx](https://github.com/whitphx) in [PR 4393](https://github.com/gradio-app/gradio/pull/4393)
 
-## Breaking Changes:
+### Breaking Changes:
 
 - The `/file=` route no longer allows accessing dotfiles or files in "dot directories" by [@akx](https://github.com/akx) in [PR 4303](https://github.com/gradio-app/gradio/pull/4303)
 
-# Version 3.32.0
+## 3.32.0
 
-## New Features:
+### New Features:
 
 - `Interface.launch()` and `Blocks.launch()` now accept an `app_kwargs` argument to allow customizing the configuration of the underlying FastAPI app, by [@akx](https://github.com/akx) in [PR 4282](https://github.com/gradio-app/gradio/pull/4282)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixed Gallery/AnnotatedImage components not respecting GRADIO_DEFAULT_DIR variable by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4256](https://github.com/gradio-app/gradio/pull/4256)
 - Fixed Gallery/AnnotatedImage components resaving identical images by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4256](https://github.com/gradio-app/gradio/pull/4256)
@@ -389,27 +373,27 @@ No changes to highlight.
 - Ensure error modal displays when the queue is enabled by [@pngwn](https://github.com/pngwn) in [PR 4273](https://github.com/gradio-app/gradio/pull/4273)
 - Ensure js client respcts the full root when making requests to the server by [@pngwn](https://github.com/pngwn) in [PR 4271](https://github.com/gradio-app/gradio/pull/4271)
 
-## Other Changes:
+### Other Changes:
 
 - Refactor web component `initial_height` attribute by [@whitphx](https://github.com/whitphx) in [PR 4223](https://github.com/gradio-app/gradio/pull/4223)
 - Relocate `mount_css` fn to remove circular dependency [@whitphx](https://github.com/whitphx) in [PR 4222](https://github.com/gradio-app/gradio/pull/4222)
 - Upgrade Black to 23.3 by [@akx](https://github.com/akx) in [PR 4259](https://github.com/gradio-app/gradio/pull/4259)
 - Add frontend LaTeX support in `gr.Chatbot()` using `KaTeX` by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 4285](https://github.com/gradio-app/gradio/pull/4285).
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-# Version 3.31.0
+## 3.31.0
 
-## New Features:
+### New Features:
 
 - The reloader command (`gradio app.py`) can now accept command line arguments by [@micky2be](https://github.com/micky2be) in [PR 4119](https://github.com/gradio-app/gradio/pull/4119)
 - Added `format` argument to `Audio` component by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4178](https://github.com/gradio-app/gradio/pull/4178)
 - Add JS client code snippets to use via api page by [@aliabd](https://github.com/aliabd) in [PR 3927](https://github.com/gradio-app/gradio/pull/3927).
 - Update to the JS client by [@pngwn](https://github.com/pngwn) in [PR 4202](https://github.com/gradio-app/gradio/pull/4202)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fix "TypeError: issubclass() arg 1 must be a class" When use Optional[Types] by [@lingfengchencn](https://github.com/lingfengchencn) in [PR 4200](https://github.com/gradio-app/gradio/pull/4200).
 - Gradio will no longer send any analytics or call home if analytics are disabled with the GRADIO_ANALYTICS_ENABLED environment variable. By [@akx](https://github.com/akx) in [PR 4194](https://github.com/gradio-app/gradio/pull/4194) and [PR 4236](https://github.com/gradio-app/gradio/pull/4236)
@@ -420,46 +404,46 @@ No changes to highlight.
 - Fixes JSONDecodeError by [@davidai](https://github.com/davidai) in [PR 4241](https://github.com/gradio-app/gradio/pull/4241)
 - Fix `chatbot_dialogpt` demo by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 4238](https://github.com/gradio-app/gradio/pull/4238).
 
-## Other Changes:
+### Other Changes:
 
 - Change `gr.Chatbot()` markdown parsing to frontend using `marked` library and `prism` by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 4150](https://github.com/gradio-app/gradio/pull/4150)
 - Update the js client by [@pngwn](https://github.com/pngwn) in [PR 3899](https://github.com/gradio-app/gradio/pull/3899)
 - Fix documentation for the shape of the numpy array produced by the `Image` component by [@der3318](https://github.com/der3318) in [PR 4204](https://github.com/gradio-app/gradio/pull/4204).
 - Updates the timeout for websocket messaging from 1 second to 5 seconds by [@abidlabs](https://github.com/abidlabs) in [PR 4235](https://github.com/gradio-app/gradio/pull/4235)
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-# Version 3.30.0
+## 3.30.0
 
-## New Features:
+### New Features:
 
 - Adds a `root_path` parameter to `launch()` that allows running Gradio applications on subpaths (e.g. www.example.com/app) behind a proxy, by [@abidlabs](https://github.com/abidlabs) in [PR 4133](https://github.com/gradio-app/gradio/pull/4133)
 - Fix dropdown change listener to trigger on change when updated as an output by [@aliabid94](https://github.com/aliabid94) in [PR 4128](https://github.com/gradio-app/gradio/pull/4128).
 - Add `.input` event listener, which is only triggered when a user changes the component value (as compared to `.change`, which is also triggered when a component updates as the result of a function trigger), by [@aliabid94](https://github.com/aliabid94) in [PR 4157](https://github.com/gradio-app/gradio/pull/4157).
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Records username when flagging by [@abidlabs](https://github.com/abidlabs) in [PR 4135](https://github.com/gradio-app/gradio/pull/4135)
 - Fix website build issue by [@aliabd](https://github.com/aliabd) in [PR 4142](https://github.com/gradio-app/gradio/pull/4142)
 - Fix lang agnostic type info for `gr.File(file_count='multiple')` output components by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4153](https://github.com/gradio-app/gradio/pull/4153)
 
-## Other Changes:
+### Other Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-# Version 3.29.0
+## 3.29.0
 
-## New Features:
+### New Features:
 
 - Returning language agnostic types in the `/info` route by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4039](https://github.com/gradio-app/gradio/pull/4039)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Allow users to upload audio files in Audio component on iOS by by [@aliabid94](https://github.com/aliabid94) in [PR 4071](https://github.com/gradio-app/gradio/pull/4071).
 - Fixes the gradio theme builder error that appeared on launch by [@aliabid94](https://github.com/aliabid94) and [@abidlabs](https://github.com/abidlabs) in [PR 4080](https://github.com/gradio-app/gradio/pull/4080)
@@ -471,135 +455,135 @@ No changes to highlight.
 - Removes extraneous `State` component info from the `/info` route by [@abidlabs](https://github.com/freddyaboulton) in [PR 4107](https://github.com/gradio-app/gradio/pull/4107)
 - Make .then() work even if first event fails by [@aliabid94](https://github.com/aliabid94) in [PR 4115](https://github.com/gradio-app/gradio/pull/4115).
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Allow users to submit with enter in Interfaces with textbox / number inputs [@aliabid94](https://github.com/aliabid94) in [PR 4090](https://github.com/gradio-app/gradio/pull/4090).
 - Updates gradio's requirements.txt to requires uvicorn>=0.14.0 by [@abidlabs](https://github.com/abidlabs) in [PR 4086](https://github.com/gradio-app/gradio/pull/4086)
 - Updates some error messaging by [@abidlabs](https://github.com/abidlabs) in [PR 4086](https://github.com/gradio-app/gradio/pull/4086)
 - Renames simplified Chinese translation file from `zh-cn.json` to `zh-CN.json` by [@abidlabs](https://github.com/abidlabs) in [PR 4086](https://github.com/gradio-app/gradio/pull/4086)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.28.3
+## 3.28.3
 
-## New Features:
+### New Features:
 
 No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixes issue with indentation in `gr.Code()` component with streaming by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 4043](https://github.com/gradio-app/gradio/pull/4043)
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.28.2
+## 3.28.2
 
-## Bug Fixes
+### Bug Fixes
 
 - Code component visual updates by [@pngwn](https://github.com/pngwn) in [PR 4051](https://github.com/gradio-app/gradio/pull/4051)
 
-## New Features:
+### New Features:
 
 - Add support for `visual-question-answering`, `document-question-answering`, and `image-to-text` using `gr.Interface.load("models/...")` and `gr.Interface.from_pipeline` by [@osanseviero](https://github.com/osanseviero) in [PR 3887](https://github.com/gradio-app/gradio/pull/3887)
 - Add code block support in `gr.Chatbot()`, by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 4048](https://github.com/gradio-app/gradio/pull/4048)
 - Adds the ability to blocklist filepaths (and also improves the allowlist mechanism) by [@abidlabs](https://github.com/abidlabs) in [PR 4047](https://github.com/gradio-app/gradio/pull/4047).
 - Adds the ability to specify the upload directory via an environment variable by [@abidlabs](https://github.com/abidlabs) in [PR 4047](https://github.com/gradio-app/gradio/pull/4047).
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixes issue with `matplotlib` not rendering correctly if the backend was not set to `Agg` by [@abidlabs](https://github.com/abidlabs) in [PR 4029](https://github.com/gradio-app/gradio/pull/4029)
 - Fixes bug where rendering the same `gr.State` across different Interfaces/Blocks within larger Blocks would not work by [@abidlabs](https://github.com/abidlabs) in [PR 4030](https://github.com/gradio-app/gradio/pull/4030)
 - Code component visual updates by [@pngwn](https://github.com/pngwn) in [PR 4051](https://github.com/gradio-app/gradio/pull/4051)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Adds a Guide on how to use the Python Client within a FastAPI app, by [@abidlabs](https://github.com/abidlabs) in [PR 3892](https://github.com/gradio-app/gradio/pull/3892)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 - `gr.HuggingFaceDatasetSaver` behavior changed internally. The `flagging/` folder is not a `.git/` folder anymore when using it. `organization` parameter is now ignored in favor of passing a full dataset id as `dataset_name` (e.g. `"username/my-dataset"`).
 - New lines (`\n`) are not automatically converted to `<br>` in `gr.Markdown()` or `gr.Chatbot()`. For multiple new lines, a developer must add multiple `<br>` tags.
 
-## Full Changelog:
+### Full Changelog:
 
 - Safer version of `gr.HuggingFaceDatasetSaver` using HTTP methods instead of git pull/push by [@Wauplin](https://github.com/Wauplin) in [PR 3973](https://github.com/gradio-app/gradio/pull/3973)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.28.1
+## 3.28.1
 
-## New Features:
+### New Features:
 
 - Add a "clear mask" button to `gr.Image` sketch modes, by [@space-nuko](https://github.com/space-nuko) in [PR 3615](https://github.com/gradio-app/gradio/pull/3615)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fix dropdown default value not appearing by [@aliabid94](https://github.com/aliabid94) in [PR 3996](https://github.com/gradio-app/gradio/pull/3996).
 - Fix faded coloring of output textboxes in iOS / Safari by [@aliabid94](https://github.com/aliabid94) in [PR 3993](https://github.com/gradio-app/gradio/pull/3993)
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 - CI: Simplified Python CI workflow by [@akx](https://github.com/akx) in [PR 3982](https://github.com/gradio-app/gradio/pull/3982)
 - Upgrade pyright to 1.1.305 by [@akx](https://github.com/akx) in [PR 4042](https://github.com/gradio-app/gradio/pull/4042)
 - More Ruff rules are enabled and lint errors fixed by [@akx](https://github.com/akx) in [PR 4038](https://github.com/gradio-app/gradio/pull/4038)
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.28.0
+## 3.28.0
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fix duplicate play commands in full-screen mode of 'video'. by [@tomchang25](https://github.com/tomchang25) in [PR 3968](https://github.com/gradio-app/gradio/pull/3968).
 - Fix the issue of the UI stuck caused by the 'selected' of DataFrame not being reset. by [@tomchang25](https://github.com/tomchang25) in [PR 3916](https://github.com/gradio-app/gradio/pull/3916).
@@ -616,38 +600,38 @@ No changes to highlight.
 - Fix bug where port was not reused if the demo was closed and then re-launched by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3896](https://github.com/gradio-app/gradio/pull/3959)
 - Fixes issue where dropdown does not position itself at selected element when opened [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 3639](https://github.com/gradio-app/gradio/pull/3639)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Make use of `gr` consistent across the docs by [@duerrsimon](https://github.com/duerrsimon) in [PR 3901](https://github.com/gradio-app/gradio/pull/3901)
 - Fixed typo in theming-guide.md by [@eltociear](https://github.com/eltociear) in [PR 3952](https://github.com/gradio-app/gradio/pull/3952)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 - CI: Python backend lint is only run once, by [@akx](https://github.com/akx) in [PR 3960](https://github.com/gradio-app/gradio/pull/3960)
 - Format invocations and concatenations were replaced by f-strings where possible by [@akx](https://github.com/akx) in [PR 3984](https://github.com/gradio-app/gradio/pull/3984)
 - Linting rules were made more strict and issues fixed by [@akx](https://github.com/akx) in [PR 3979](https://github.com/gradio-app/gradio/pull/3979).
 
-## Breaking Changes:
+### Breaking Changes:
 
 - Some re-exports in `gradio.themes` utilities (introduced in 3.24.0) have been eradicated.
   By [@akx](https://github.com/akx) in [PR 3958](https://github.com/gradio-app/gradio/pull/3958)
 
-## Full Changelog:
+### Full Changelog:
 
 - Add DESCRIPTION.md to image_segmentation demo by [@aliabd](https://github.com/aliabd) in [PR 3866](https://github.com/gradio-app/gradio/pull/3866)
 - Fix error in running `gr.themes.builder()` by [@deepkyu](https://github.com/deepkyu) in [PR 3869](https://github.com/gradio-app/gradio/pull/3869)
 - Fixed a JavaScript TypeError when loading custom JS with `_js` and setting `outputs` to `None` in `gradio.Blocks()` by [@DavG25](https://github.com/DavG25) in [PR 3883](https://github.com/gradio-app/gradio/pull/3883)
 - Fixed bg_background_fill theme property to expand to whole background, block_radius to affect form elements as well, and added block_label_shadow theme property by [@aliabid94](https://github.com/aliabid94) in [PR 3590](https://github.com/gradio-app/gradio/pull/3590)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.27.0
+## 3.27.0
 
-## New Features:
+### New Features:
 
-### AnnotatedImage Component
+###### AnnotatedImage Component
 
 New AnnotatedImage component allows users to highlight regions of an image, either by providing bounding boxes, or 0-1 pixel masks. This component is useful for tasks such as image segmentation, object detection, and image captioning.
 
@@ -668,35 +652,35 @@ with gr.Blocks() as demo:
 
 See the [image_segmentation demo](https://github.com/gradio-app/gradio/tree/main/demo/image_segmentation) for a full example. By [@aliabid94](https://github.com/aliabid94) in [PR 3836](https://github.com/gradio-app/gradio/pull/3836)
 
-## Bug Fixes:
+### Bug Fixes:
 
 No changes to highlight.
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.26.0
+## 3.26.0
 
-## New Features:
+### New Features:
 
-### `Video` component supports subtitles
+###### `Video` component supports subtitles
 
 - Allow the video component to accept subtitles as input, by [@tomchang25](https://github.com/tomchang25) in [PR 3673](https://github.com/gradio-app/gradio/pull/3673). To provide subtitles, simply return a tuple consisting of `(path_to_video, path_to_subtitles)` from your function. Both `.srt` and `.vtt` formats are supported:
 
@@ -705,35 +689,35 @@ with gr.Blocks() as demo:
     gr.Video(("video.mp4", "captions.srt"))
 ```
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fix code markdown support in `gr.Chatbot()` component by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 3816](https://github.com/gradio-app/gradio/pull/3816)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Updates the "view API" page in Gradio apps to use the `gradio_client` library by [@aliabd](https://github.com/aliabd) in [PR 3765](https://github.com/gradio-app/gradio/pull/3765)
 
 - Read more about how to use the `gradio_client` library here: https://gradio.app/getting-started-with-the-python-client/
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.25.0
+## 3.25.0
 
-## New Features:
+### New Features:
 
 - Improve error messages when number of inputs/outputs to event handlers mismatch, by [@space-nuko](https://github.com/space-nuko) in [PR 3519](https://github.com/gradio-app/gradio/pull/3519)
 
@@ -753,7 +737,7 @@ with gr.Blocks() as demo:
 
 ![Recording 2023-04-08 at 17 44 39](https://user-images.githubusercontent.com/7870876/230748572-90a2a8d5-116d-4769-bb53-5516555fbd0f.gif)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Increase timeout for sending analytics data by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 3647](https://github.com/gradio-app/gradio/pull/3647)
 - Fix bug where http token was not accessed over websocket connections by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3735](https://github.com/gradio-app/gradio/pull/3735)
@@ -764,61 +748,61 @@ with gr.Blocks() as demo:
 - Fix bug where the upload button was not properly handling the `file_count='multiple'` case by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3782](https://github.com/gradio-app/gradio/pull/3782)
 - Fix bug where use Via API button was giving error by [@Devang-C](https://github.com/Devang-C) in [PR 3783](https://github.com/gradio-app/gradio/pull/3783)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Fix invalid argument docstrings, by [@akx](https://github.com/akx) in [PR 3740](https://github.com/gradio-app/gradio/pull/3740)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Fixed IPv6 listening to work with bracket [::1] notation, by [@dsully](https://github.com/dsully) in [PR 3695](https://github.com/gradio-app/gradio/pull/3695)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.24.1
+## 3.24.1
 
-## New Features:
+### New Features:
 
 - No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixes Chatbot issue where new lines were being created every time a message was sent back and forth by [@aliabid94](https://github.com/aliabid94) in [PR 3717](https://github.com/gradio-app/gradio/pull/3717).
 - Fixes data updating in DataFrame invoking a `select` event once the dataframe has been selected. By [@yiyuezhuo](https://github.com/yiyuezhuo) in [PR 3861](https://github.com/gradio-app/gradio/pull/3861)
 - Fixes false positive warning which is due to too strict type checking by [@yiyuezhuo](https://github.com/yiyuezhuo) in [PR 3837](https://github.com/gradio-app/gradio/pull/3837).
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.24.0
+## 3.24.0
 
-## New Features:
+### New Features:
 
 - Trigger the release event when Slider number input is released or unfocused by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3589](https://github.com/gradio-app/gradio/pull/3589)
 - Created Theme Builder, which allows users to create themes without writing any code, by [@aliabid94](https://github.com/aliabid94) in [PR 3664](https://github.com/gradio-app/gradio/pull/3664). Launch by:
@@ -833,7 +817,7 @@ No changes to highlight.
 - The `Dropdown` component now has a `allow_custom_value` parameter that lets users type in custom values not in the original list of choices.
 - The `Colorpicker` component now has a `.blur()` event
 
-### Added a download button for videos! 📥
+###### Added a download button for videos! 📥
 
 ![download_video](https://user-images.githubusercontent.com/41651716/227009612-9bc5fb72-2a44-4c55-9b7b-a0fa098e7f25.gif)
 
@@ -841,7 +825,7 @@ By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3581](https://git
 
 - Trigger the release event when Slider number input is released or unfocused by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3589](https://github.com/gradio-app/gradio/pull/3589)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixed bug where text for altair plots was not legible in dark mode by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3555](https://github.com/gradio-app/gradio/pull/3555)
 - Fixes `Chatbot` and `Image` components so that files passed during processing are added to a directory where they can be served from, by [@abidlabs](https://github.com/abidlabs) in [PR 3523](https://github.com/gradio-app/gradio/pull/3523)
@@ -864,24 +848,24 @@ By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3581](https://git
 - Fix items in `gr.Dropdown` besides the selected item receiving a checkmark, by [@space-nuko](https://github.com/space-nuko) in [PR 3644](https://github.com/gradio-app/gradio/pull/3644)
 - Fix several `gr.Dropdown` issues and improve usability, by [@space-nuko](https://github.com/space-nuko) in [PR 3705](https://github.com/gradio-app/gradio/pull/3705)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Makes some fixes to the Theme Guide related to naming of variables, by [@abidlabs](https://github.com/abidlabs) in [PR 3561](https://github.com/gradio-app/gradio/pull/3561)
 - Documented `HuggingFaceDatasetJSONSaver` by [@osanseviero](https://github.com/osanseviero) in [PR 3604](https://github.com/gradio-app/gradio/pull/3604)
 - Makes some additions to documentation of `Audio` and `State` components, and fixes the `pictionary` demo by [@abidlabs](https://github.com/abidlabs) in [PR 3611](https://github.com/gradio-app/gradio/pull/3611)
 - Fix outdated sharing your app guide by [@aliabd](https://github.com/aliabd) in [PR 3699](https://github.com/gradio-app/gradio/pull/3699)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 - Removed heavily-mocked tests related to comet_ml, wandb, and mlflow as they added a significant amount of test dependencies that prevented installation of test dependencies on Windows environments. By [@abidlabs](https://github.com/abidlabs) in [PR 3608](https://github.com/gradio-app/gradio/pull/3608)
 - Added Windows continuous integration, by [@space-nuko](https://github.com/space-nuko) in [PR 3628](https://github.com/gradio-app/gradio/pull/3628)
 - Switched linting from flake8 + isort to `ruff`, by [@akx](https://github.com/akx) in [PR 3710](https://github.com/gradio-app/gradio/pull/3710)
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Mobile responsive iframes in themes guide by [@aliabd](https://github.com/aliabd) in [PR 3562](https://github.com/gradio-app/gradio/pull/3562)
 - Remove extra $demo from theme guide by [@aliabd](https://github.com/aliabd) in [PR 3563](https://github.com/gradio-app/gradio/pull/3563)
@@ -891,127 +875,127 @@ No changes to highlight.
 - Allows users to apss in a string name for a built-in theme, by [@abidlabs](https://github.com/abidlabs) in [PR 3641](https://github.com/gradio-app/gradio/pull/3641)
 - Added `orig_name` to Video output in the backend so that the front end can set the right name for downloaded video files by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3700](https://github.com/gradio-app/gradio/pull/3700)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.23.0
+## 3.23.0
 
-## New Features:
+### New Features:
 
-### Theme Sharing!
+###### Theme Sharing!
 
 Once you have created a theme, you can upload it to the HuggingFace Hub to let others view it, use it, and build off of it! You can also download, reuse, and remix other peoples' themes. See https://gradio.app/theming-guide/ for more details.
 
 By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3428](https://github.com/gradio-app/gradio/pull/3428)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Removes leading spaces from all lines of code uniformly in the `gr.Code()` component. By [@abidlabs](https://github.com/abidlabs) in [PR 3556](https://github.com/gradio-app/gradio/pull/3556)
 - Fixed broken login page, by [@aliabid94](https://github.com/aliabid94) in [PR 3529](https://github.com/gradio-app/gradio/pull/3529)
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Fix rendering of dropdowns to take more space, and related bugs, by [@aliabid94](https://github.com/aliabid94) in [PR 3549](https://github.com/gradio-app/gradio/pull/3549)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.22.1
+## 3.22.1
 
-## New Features:
+### New Features:
 
 No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Restore label bars by [@aliabid94](https://github.com/aliabid94) in [PR 3507](https://github.com/gradio-app/gradio/pull/3507)
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.22.0
+## 3.22.0
 
-## New Features:
+### New Features:
 
-### Official Theme release
+###### Official Theme release
 
 Gradio now supports a new theme system, which allows you to customize the look and feel of your app. You can now use the `theme=` kwarg to pass in a prebuilt theme, or customize your own! See https://gradio.app/theming-guide/ for more details. By [@aliabid94](https://github.com/aliabid94) in [PR 3470](https://github.com/gradio-app/gradio/pull/3470) and [PR 3497](https://github.com/gradio-app/gradio/pull/3497)
 
-### `elem_classes`
+###### `elem_classes`
 
 Add keyword argument `elem_classes` to Components to control class names of components, in the same manner as existing `elem_id`.
 By [@aliabid94](https://github.com/aliabid94) in [PR 3466](https://github.com/gradio-app/gradio/pull/3466)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixes the File.upload() event trigger which broke as part of the change in how we uploaded files by [@abidlabs](https://github.com/abidlabs) in [PR 3462](https://github.com/gradio-app/gradio/pull/3462)
 - Fixed issue with `gr.Request` object failing to handle dictionaries when nested keys couldn't be converted to variable names [#3454](https://github.com/gradio-app/gradio/issues/3454) by [@radames](https://github.com/radames) in [PR 3459](https://github.com/gradio-app/gradio/pull/3459)
 - Fixed bug where css and client api was not working properly when mounted in a subpath by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3482](https://github.com/gradio-app/gradio/pull/3482)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Document gr.Error in the docs by [@aliabd](https://github.com/aliabd) in [PR 3465](https://github.com/gradio-app/gradio/pull/3465)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 - Pinned `pyright==1.1.298` for stability by [@abidlabs](https://github.com/abidlabs) in [PR 3475](https://github.com/gradio-app/gradio/pull/3475)
 - Removed `IOComponent.add_interactive_to_config()` by [@space-nuko](https://github.com/space-nuko) in [PR 3476](https://github.com/gradio-app/gradio/pull/3476)
 - Removed `IOComponent.generate_sample()` by [@space-nuko](https://github.com/space-nuko) in [PR 3475](https://github.com/gradio-app/gradio/pull/3483)
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Revert primary button background color in dark mode by [@aliabid94](https://github.com/aliabid94) in [PR 3468](https://github.com/gradio-app/gradio/pull/3468)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.21.0
+## 3.21.0
 
-## New Features:
+### New Features:
 
-### Theme Sharing 🎨 🤝
+###### Theme Sharing 🎨 🤝
 
 You can now share your gradio themes with the world!
 
 After creating a theme, you can upload it to the HuggingFace Hub to let others view it, use it, and build off of it!
 
-### Uploading
+###### Uploading
 
 There are two ways to upload a theme, via the theme class instance or the command line.
 
@@ -1047,7 +1031,7 @@ This creates a space on the huggingface hub to host the theme files and show pot
 
 An example theme space is here: https://huggingface.co/spaces/freddyaboulton/dracula_revamped
 
-### Downloading
+###### Downloading
 
 To use a theme from the hub, use the `from_hub` method on the `ThemeClass` and pass it to your app:
 
@@ -1071,11 +1055,11 @@ with gr.Blocks(theme="freddyaboulton/my_theme@>=0.1.0,<0.2.0") as demo:
 
 by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3428](https://github.com/gradio-app/gradio/pull/3428)
 
-### Code component 🦾
+###### Code component 🦾
 
 New code component allows you to enter, edit and display code with full syntax highlighting by [@pngwn](https://github.com/pngwn) in [PR 3421](https://github.com/gradio-app/gradio/pull/3421)
 
-### The `Chatbot` component now supports audio, video, and images
+###### The `Chatbot` component now supports audio, video, and images
 
 The `Chatbot` component now supports audio, video, and images with a simple syntax: simply
 pass in a tuple with the URL or filepath (the second optional element of the tuple is alt text), and the image/audio/video will be displayed:
@@ -1117,7 +1101,7 @@ By [@aliabid94](https://github.com/aliabid94) in [PR 3399](https://github.com/gr
 
 - The `Textbox` component now includes a copy button by [@abidlabs](https://github.com/abidlabs) in [PR 3452](https://github.com/gradio-app/gradio/pull/3452)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Use `huggingface_hub` to send telemetry on `interface` and `blocks`; eventually to replace segment by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 3342](https://github.com/gradio-app/gradio/pull/3342)
 - Ensure load events created by components (randomize for slider, callable values) are never queued unless every is passed by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3391](https://github.com/gradio-app/gradio/pull/3391)
@@ -1126,7 +1110,7 @@ By [@aliabid94](https://github.com/aliabid94) in [PR 3399](https://github.com/gr
 - Ensure dropdown does not highlight partial matches by [@pngwn](https://github.com/pngwn) in [PR 3421](https://github.com/gradio-app/gradio/pull/3421)
 - Fix mic button display by [@aliabid94](https://github.com/aliabid94) in [PR 3456](https://github.com/gradio-app/gradio/pull/3456)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Added a section on security and access when sharing Gradio apps by [@abidlabs](https://github.com/abidlabs) in [PR 3408](https://github.com/gradio-app/gradio/pull/3408)
 - Add Chinese README by [@uanu2002](https://github.com/uanu2002) in [PR 3394](https://github.com/gradio-app/gradio/pull/3394)
@@ -1135,16 +1119,16 @@ By [@aliabid94](https://github.com/aliabid94) in [PR 3399](https://github.com/gr
 - Document Blocks methods by [@aliabd](https://github.com/aliabd) in [PR 3427](https://github.com/gradio-app/gradio/pull/3427)
 - Fixed bug where event handlers were not showing up in documentation by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3434](https://github.com/gradio-app/gradio/pull/3434)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 - Fixes tests that were failing locally but passing on CI by [@abidlabs](https://github.com/abidlabs) in [PR 3411](https://github.com/gradio-app/gradio/pull/3411)
 - Remove codecov from the repo by [@aliabd](https://github.com/aliabd) in [PR 3415](https://github.com/gradio-app/gradio/pull/3415)
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Prevent in-place updates of `generic_update` by shallow copying by [@gitgithan](https://github.com/gitgithan) in [PR 3405](https://github.com/gradio-app/gradio/pull/3405) to fix [#3282](https://github.com/gradio-app/gradio/issues/3282)
 - Persist file names of files uploaded through any Gradio component by [@abidlabs](https://github.com/abidlabs) in [PR 3412](https://github.com/gradio-app/gradio/pull/3412)
@@ -1153,13 +1137,13 @@ No changes to highlight.
 - Fix css issue with spaces logo by [@aliabd](https://github.com/aliabd) in [PR 3422](https://github.com/gradio-app/gradio/pull/3422)
 - Makes a few fixes to the `JSON` component (show_label parameter, icons) in [@abidlabs](https://github.com/abidlabs) in [PR 3451](https://github.com/gradio-app/gradio/pull/3451)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.20.1
+## 3.20.1
 
-## New Features:
+### New Features:
 
 - Add `height` kwarg to style in `gr.Chatbot()` component by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 3369](https://github.com/gradio-app/gradio/pull/3369)
 
@@ -1167,36 +1151,36 @@ No changes to highlight.
 chatbot = gr.Chatbot().style(height=500)
 ```
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Ensure uploaded images are always shown in the sketch tool by [@pngwn](https://github.com/pngwn) in [PR 3386](https://github.com/gradio-app/gradio/pull/3386)
 - Fixes bug where when if fn is a non-static class member, then self should be ignored as the first param of the fn by [@or25](https://github.com/or25) in [PR #3227](https://github.com/gradio-app/gradio/pull/3227)
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.20.0
+## 3.20.0
 
-## New Features:
+### New Features:
 
-### Release event for Slider
+###### Release event for Slider
 
 Now you can trigger your python function to run when the slider is released as opposed to every slider change value!
 
@@ -1208,7 +1192,7 @@ slider.release(function, inputs=[...], outputs=[...], api_name="predict")
 
 By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3353](https://github.com/gradio-app/gradio/pull/3353)
 
-### Dropdown Component Updates
+###### Dropdown Component Updates
 
 The standard dropdown component now supports searching for choices. Also when `multiselect` is `True`, you can specify `max_choices` to set the maximum number of choices you want the user to be able to select from the dropdown component.
 
@@ -1218,7 +1202,7 @@ gr.Dropdown(label="Choose your favorite colors", choices=["red", "blue", "green"
 
 by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 3211](https://github.com/gradio-app/gradio/pull/3211)
 
-### Download button for images 🖼️
+###### Download button for images 🖼️
 
 Output images will now automatically have a download button displayed to make it easier to save and share
 the results of Machine Learning art models.
@@ -1236,7 +1220,7 @@ By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3297](https://git
 - Allow developers to access the username of a logged-in user from the `gr.Request()` object using the `.username` attribute by [@abidlabs](https://github.com/abidlabs) in [PR 3296](https://github.com/gradio-app/gradio/pull/3296)
 - Add `preview` option to `Gallery.style` that launches the gallery in preview mode when first loaded by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3345](https://github.com/gradio-app/gradio/pull/3345)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Ensure `mirror_webcam` is always respected by [@pngwn](https://github.com/pngwn) in [PR 3245](https://github.com/gradio-app/gradio/pull/3245)
 - Fix issue where updated markdown links were not being opened in a new tab by [@gante](https://github.com/gante) in [PR 3236](https://github.com/gradio-app/gradio/pull/3236)
@@ -1259,68 +1243,68 @@ By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3297](https://git
 - Fix error when using backen_fn and custom js at the same time by [@jialeicui](https://github.com/jialeicui) in [PR 3358](https://github.com/gradio-app/gradio/pull/3358)
 - Support new embeds for huggingface spaces subdomains by [@pngwn](https://github.com/pngwn) in [PR 3367](https://github.com/gradio-app/gradio/pull/3367)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Added the `types` field to the dependency field in the config by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3315](https://github.com/gradio-app/gradio/pull/3315)
 - Gradio Status Page by [@aliabd](https://github.com/aliabd) in [PR 3331](https://github.com/gradio-app/gradio/pull/3331)
 - Adds a Guide on setting up a dashboard from Supabase data using the `gr.BarPlot`
   component by [@abidlabs](https://github.com/abidlabs) in [PR 3275](https://github.com/gradio-app/gradio/pull/3275)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 - Adds a script to benchmark the performance of the queue and adds some instructions on how to use it. By [@freddyaboulton](https://github.com/freddyaboulton) and [@abidlabs](https://github.com/abidlabs) in [PR 3272](https://github.com/gradio-app/gradio/pull/3272)
 - Flaky python tests no longer cancel non-flaky tests by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3344](https://github.com/gradio-app/gradio/pull/3344)
 
-## Breaking Changes:
+### Breaking Changes:
 
 - Chatbot bubble colors can no longer be set by `chatbot.style(color_map=)` by [@aliabid94] in [PR 3370](https://github.com/gradio-app/gradio/pull/3370)
 
-## Full Changelog:
+### Full Changelog:
 
 - Fixed comment typo in components.py by [@eltociear](https://github.com/eltociear) in [PR 3235](https://github.com/gradio-app/gradio/pull/3235)
 - Cleaned up chatbot ui look and feel by [@aliabid94] in [PR 3370](https://github.com/gradio-app/gradio/pull/3370)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.19.1
+## 3.19.1
 
-## New Features:
+### New Features:
 
 No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 
 - UI fixes including footer and API docs by [@aliabid94](https://github.com/aliabid94) in [PR 3242](https://github.com/gradio-app/gradio/pull/3242)
 - Updated image upload component to accept all image formats, including lossless formats like .webp by [@fienestar](https://github.com/fienestar) in [PR 3225](https://github.com/gradio-app/gradio/pull/3225)
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Added backend support for themes by [@aliabid94](https://github.com/aliabid94) in [PR 2931](https://github.com/gradio-app/gradio/pull/2931)
 - Added support for button sizes "lg" (default) and "sm".
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.19.0
+## 3.19.0
 
-## New Features:
+### New Features:
 
-### Improved embedding experience
+###### Improved embedding experience
 
 When embedding a spaces-hosted gradio app as a web component, you now get an improved UI linking back to the original space, better error handling and more intelligent load performance. No changes are required to your code to benefit from this enhanced experience; simply upgrade your gradio SDK to the latest version.
 
@@ -1338,7 +1322,7 @@ This behaviour is configurable. You can pass `eager="true"` to load and render t
 
 by [@pngwn](https://github.com/pngwn) in [PR 3205](https://github.com/gradio-app/gradio/pull/3205)
 
-### New `gr.BarPlot` component! 📊
+###### New `gr.BarPlot` component! 📊
 
 Create interactive bar plots from a high-level interface with `gr.BarPlot`.
 No need to remember matplotlib syntax anymore!
@@ -1368,7 +1352,7 @@ demo.launch()
 
 By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3157](https://github.com/gradio-app/gradio/pull/3157)
 
-### Bokeh plots are back! 🌠
+###### Bokeh plots are back! 🌠
 
 Fixed a bug that prevented bokeh plots from being displayed on the front end and extended support for both 2.x and 3.x versions of bokeh!
 
@@ -1376,7 +1360,7 @@ Fixed a bug that prevented bokeh plots from being displayed on the front end and
 
 By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3212](https://github.com/gradio-app/gradio/pull/3212)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Adds ability to add a single message from the bot or user side. Ex: specify `None` as the second value in the tuple, to add a single message in the chatbot from the "bot" side.
 
@@ -1395,7 +1379,7 @@ By [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 3165](https://github.
 - Fix bug where auth cookies where not sent when connecting to an app via http by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3223](https://github.com/gradio-app/gradio/pull/3223)
 - Ensure latext CSS is always applied in light and dark mode by [@pngwn](https://github.com/pngwn) in [PR 3233](https://github.com/gradio-app/gradio/pull/3233)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Sort components in docs by alphabetic order by [@aliabd](https://github.com/aliabd) in [PR 3152](https://github.com/gradio-app/gradio/pull/3152)
 - Changes to W&B guide by [@scottire](https://github.com/scottire) in [PR 3153](https://github.com/gradio-app/gradio/pull/3153)
@@ -1404,15 +1388,15 @@ By [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 3165](https://github.
 - Fixed typos in gradio events function documentation by [@vidalmaxime](https://github.com/vidalmaxime) in [PR 3168](https://github.com/gradio-app/gradio/pull/3168)
 - Added an example using Gradio's batch mode with the diffusers library by [@abidlabs](https://github.com/abidlabs) in [PR 3224](https://github.com/gradio-app/gradio/pull/3224)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Fix demos page css and add close demos button by [@aliabd](https://github.com/aliabd) in [PR 3151](https://github.com/gradio-app/gradio/pull/3151)
 - Caches temp files from base64 input data by giving them a deterministic path based on the contents of data by [@abidlabs](https://github.com/abidlabs) in [PR 3197](https://github.com/gradio-app/gradio/pull/3197)
@@ -1421,15 +1405,15 @@ No changes to highlight.
 - Fixed gradio share links so that they are persistent and do not reset if network
   connection is disrupted by by [XciD](https://github.com/XciD), [Wauplin](https://github.com/Wauplin), and [@abidlabs](https://github.com/abidlabs) in [PR 3149](https://github.com/gradio-app/gradio/pull/3149) and a follow-up to allow it to work for users upgrading from a previous Gradio version in [PR 3221](https://github.com/gradio-app/gradio/pull/3221)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.18.0
+## 3.18.0
 
-## New Features:
+### New Features:
 
-### Revamped Stop Button for Interfaces 🛑
+###### Revamped Stop Button for Interfaces 🛑
 
 If your Interface function is a generator, there used to be a separate `Stop` button displayed next
 to the `Submit` button.
@@ -1440,7 +1424,7 @@ The `Stop` button will automatically turn back to a `Submit` button at the end o
 
 By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3124](https://github.com/gradio-app/gradio/pull/3124)
 
-### Queue now works with reload mode!
+###### Queue now works with reload mode!
 
 You can now call `queue` on your `demo` outside of the `if __name__ == "__main__"` block and
 run the script in reload mode with the `gradio` command.
@@ -1450,7 +1434,7 @@ properly!
 
 By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3089](https://github.com/gradio-app/gradio/pull/3089)
 
-### Allow serving files from additional directories
+###### Allow serving files from additional directories
 
 ```python
 demo = gr.Interface(...)
@@ -1461,7 +1445,7 @@ demo.launch(
 
 By [@maxaudron](https://github.com/maxaudron) in [PR 3075](https://github.com/gradio-app/gradio/pull/3075)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixes URL resolution on Windows by [@abidlabs](https://github.com/abidlabs) in [PR 3108](https://github.com/gradio-app/gradio/pull/3108)
 - Example caching now works with components without a label attribute (e.g. `Column`) by [@abidlabs](https://github.com/abidlabs) in [PR 3123](https://github.com/gradio-app/gradio/pull/3123)
@@ -1474,46 +1458,46 @@ By [@maxaudron](https://github.com/maxaudron) in [PR 3075](https://github.com/gr
 - Fixed bug where example pagination buttons were not visible in dark mode or displayed under the examples table. By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3144](https://github.com/gradio-app/gradio/pull/3144)
 - Fixed bug where the font color of axis labels and titles for native plots did not respond to dark mode preferences. By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3146](https://github.com/gradio-app/gradio/pull/3146)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Added a guide on the 4 kinds of Gradio Interfaces by [@yvrjsharma](https://github.com/yvrjsharma) and [@abidlabs](https://github.com/abidlabs) in [PR 3003](https://github.com/gradio-app/gradio/pull/3003)
 - Explained that the parameters in `launch` will not be respected when using reload mode, e.g. `gradio` command by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3089](https://github.com/gradio-app/gradio/pull/3089)
 - Added a demo to show how to set up variable numbers of outputs in Gradio by [@abidlabs](https://github.com/abidlabs) in [PR 3127](https://github.com/gradio-app/gradio/pull/3127)
 - Updated docs to reflect that the `equal_height` parameter should be passed to the `.style()` method of `gr.Row()` by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3125](https://github.com/gradio-app/gradio/pull/3125)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Changed URL of final image for `fake_diffusion` demos by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3120](https://github.com/gradio-app/gradio/pull/3120)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.17.1
+## 3.17.1
 
-## New Features:
+### New Features:
 
-### iOS image rotation fixed 🔄
+###### iOS image rotation fixed 🔄
 
 Previously photos uploaded via iOS would be rotated after processing. This has been fixed by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3089](https://github.com/gradio-app/gradio/pull/3091)
 
-#### Before
+######### Before
 
 ![image](https://user-images.githubusercontent.com/41651716/215846507-a36e9d05-1ac2-4867-8ab3-ce045a9415d9.png)
 
-#### After
+######### After
 
 ![image](https://user-images.githubusercontent.com/41651716/215846554-e41773ed-70f0-491a-9952-6a18babf91ef.png)
 
-### Run on Kaggle kernels 🧪
+###### Run on Kaggle kernels 🧪
 
 A share link will automatically be created when running on Kaggle kernels (notebooks) so that the front-end is properly displayed.
 
@@ -1521,7 +1505,7 @@ A share link will automatically be created when running on Kaggle kernels (noteb
 
 By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3101](https://github.com/gradio-app/gradio/pull/3101)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fix bug where examples were not rendered correctly for demos created with Blocks api that had multiple input compinents by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3090](https://github.com/gradio-app/gradio/pull/3090)
 - Fix change event listener for JSON, HighlightedText, Chatbot by [@aliabid94](https://github.com/aliabid94) in [PR 3095](https://github.com/gradio-app/gradio/pull/3095)
@@ -1529,7 +1513,7 @@ By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3101](https://git
 - Fixes bug where static_video play and pause event not working [@tomchang25](https://github.com/tomchang25) in [PR 3098](https://github.com/gradio-app/gradio/pull/3098)
 - Fixed `Gallery.style(grid=...)` by by [@aliabd](https://github.com/aliabd) in [PR 3107](https://github.com/gradio-app/gradio/pull/3107)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Update chatbot guide to include blocks demo and markdown support section by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 3023](https://github.com/gradio-app/gradio/pull/3023)
 
@@ -1537,31 +1521,31 @@ By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3101](https://git
 * Better docs navigation on mobile by [@aliabd](https://github.com/aliabd) in [PR 3112](https://github.com/gradio-app/gradio/pull/3112)
 * Add a guide on using Gradio with [Comet](https://comet.com/), by [@DN6](https://github.com/DN6/) in [PR 3058](https://github.com/gradio-app/gradio/pull/3058)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Set minimum `markdown-it-py` version to `2.0.0` so that the dollar math plugin is compatible by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3102](https://github.com/gradio-app/gradio/pull/3102)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.17.0
+## 3.17.0
 
-## New Features:
+### New Features:
 
-### Extended support for Interface.load! 🏗️
+###### Extended support for Interface.load! 🏗️
 
 You can now load `image-to-text` and `conversational` pipelines from the hub!
 
-### Image-to-text Demo
+###### Image-to-text Demo
 
 ```python
 io = gr.Interface.load("models/nlpconnect/vit-gpt2-image-captioning",
@@ -1571,7 +1555,7 @@ io.launch()
 
 <img width="1087" alt="image" src="https://user-images.githubusercontent.com/41651716/213260197-dc5d80b4-6e50-4b3a-a764-94980930ac38.png">
 
-### conversational Demo
+###### conversational Demo
 
 ```python
 chatbot = gr.Interface.load("models/microsoft/DialoGPT-medium",
@@ -1583,7 +1567,7 @@ chatbot.launch()
 
 By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3011](https://github.com/gradio-app/gradio/pull/3011)
 
-### Download Button added to Model3D Output Component 📥
+###### Download Button added to Model3D Output Component 📥
 
 No need for an additional file output component to enable model3d file downloads anymore. We now added a download button to the model3d component itself.
 
@@ -1591,14 +1575,14 @@ No need for an additional file output component to enable model3d file downloads
 
 By [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 3014](https://github.com/gradio-app/gradio/pull/3014)
 
-### Fixing Auth on Spaces 🔑
+###### Fixing Auth on Spaces 🔑
 
 Authentication on spaces works now! Third party cookies must be enabled on your browser to be able
 to log in. Some browsers disable third party cookies by default (Safari, Chrome Incognito).
 
 ![auth_spaces](https://user-images.githubusercontent.com/41651716/215528417-09538933-0576-4d1d-b3b9-1e877ab01905.gif)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixes bug where interpretation event was not configured correctly by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2993](https://github.com/gradio-app/gradio/pull/2993)
 - Fix relative import bug in reload mode by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2992](https://github.com/gradio-app/gradio/pull/2992)
@@ -1630,36 +1614,36 @@ to log in. Some browsers disable third party cookies by default (Safari, Chrome
 - Fixes bug where tabs selected attribute not working if manually change tab by [@tomchang25](https://github.com/tomchang25) in [3055](https://github.com/gradio-app/gradio/pull/3055)
 - Change chatbot to show dots on progress, and fix bug where chatbot would not stick to bottom in the case of images by [@aliabid94](https://github.com/aliabid94) in [PR 3067](https://github.com/gradio-app/gradio/pull/3079)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - SEO improvements to guides by[@aliabd](https://github.com/aliabd) in [PR 2915](https://github.com/gradio-app/gradio/pull/2915)
 - Use `gr.LinePlot` for the `blocks_kinematics` demo by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2998](https://github.com/gradio-app/gradio/pull/2998)
 - Updated the `interface_series_load` to include some inline markdown code by [@abidlabs](https://github.com/abidlabs) in [PR 3051](https://github.com/gradio-app/gradio/pull/3051)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 - Adds a GitHub action to test if any large files (> 5MB) are present by [@abidlabs](https://github.com/abidlabs) in [PR 3013](https://github.com/gradio-app/gradio/pull/3013)
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Rewrote frontend using CSS variables for themes by [@pngwn](https://github.com/pngwn) in [PR 2840](https://github.com/gradio-app/gradio/pull/2840)
 - Moved telemetry requests to run on background threads by [@abidlabs](https://github.com/abidlabs) in [PR 3054](https://github.com/gradio-app/gradio/pull/3054)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.16.2
+## 3.16.2
 
-## New Features:
+### New Features:
 
 No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixed file upload fails for files with zero size by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 2923](https://github.com/gradio-app/gradio/pull/2923)
 - Fixed bug where `mount_gradio_app` would not launch if the queue was enabled in a gradio app by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2939](https://github.com/gradio-app/gradio/pull/2939)
@@ -1670,61 +1654,61 @@ No changes to highlight.
 - Fix bug where outputs for examples where not being returned by the backend by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2955](https://github.com/gradio-app/gradio/pull/2955)
 - Fix bug in `blocks_plug` demo that prevented switching tabs programmatically with python [@TashaSkyUp](https://github.com/https://github.com/TashaSkyUp) in [PR 2971](https://github.com/gradio-app/gradio/pull/2971).
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.16.1
+## 3.16.1
 
-## New Features:
+### New Features:
 
 No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fix audio file output by [@aliabid94](https://github.com/aliabid94) in [PR 2950](https://github.com/gradio-app/gradio/pull/2950).
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.16.0
+## 3.16.0
 
-## New Features:
+### New Features:
 
-### Send custom progress updates by adding a `gr.Progress` argument after the input arguments to any function. Example:
+###### Send custom progress updates by adding a `gr.Progress` argument after the input arguments to any function. Example:
 
 ```python
 def reverse(word, progress=gr.Progress()):
@@ -1745,7 +1729,7 @@ Progress indicator bar by [@aliabid94](https://github.com/aliabid94) in [PR 2750
 - Add support for specifying file extensions for `gr.File` and `gr.UploadButton`, using `file_types` parameter (e.g `gr.File(file_count="multiple", file_types=["text", ".json", ".csv"])`) by @dawoodkhan82 in [#2901](https://github.com/gradio-app/gradio/pull/2901)
 - Added `multiselect` option to `Dropdown` by @dawoodkhan82 in [#2871](https://github.com/gradio-app/gradio/pull/2871)
 
-### With `multiselect` set to `true` a user can now select multiple options from the `gr.Dropdown` component.
+###### With `multiselect` set to `true` a user can now select multiple options from the `gr.Dropdown` component.
 
 ```python
 gr.Dropdown(["angola", "pakistan", "canada"], multiselect=True, value=["angola"])
@@ -1753,7 +1737,7 @@ gr.Dropdown(["angola", "pakistan", "canada"], multiselect=True, value=["angola"]
 
 <img width="610" alt="Screenshot 2023-01-03 at 4 14 36 PM" src="https://user-images.githubusercontent.com/12725292/210442547-c86975c9-4b4f-4b8e-8803-9d96e6a8583a.png">
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixed bug where an error opening an audio file led to a crash by [@FelixDombek](https://github.com/FelixDombek) in [PR 2898](https://github.com/gradio-app/gradio/pull/2898)
 - Fixed bug where setting `default_enabled=False` made it so that the entire queue did not start by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2876](https://github.com/gradio-app/gradio/pull/2876)
@@ -1764,20 +1748,20 @@ gr.Dropdown(["angola", "pakistan", "canada"], multiselect=True, value=["angola"]
 - Fixed bug where files could not be downloaded by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2926](https://github.com/gradio-app/gradio/pull/2926)
 - Fixed bug where cached examples were not displaying properly by [@a-rogalska](https://github.com/a-rogalska) in [PR 2974](https://github.com/gradio-app/gradio/pull/2974)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Added a Guide on using Google Sheets to create a real-time dashboard with Gradio's `DataFrame` and `LinePlot` component, by [@abidlabs](https://github.com/abidlabs) in [PR 2816](https://github.com/gradio-app/gradio/pull/2816)
 - Add a components - events matrix on the docs by [@aliabd](https://github.com/aliabd) in [PR 2921](https://github.com/gradio-app/gradio/pull/2921)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 - Deployed PRs from forks to spaces by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2895](https://github.com/gradio-app/gradio/pull/2895)
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - The `default_enabled` parameter of the `Blocks.queue` method has no effect by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2876](https://github.com/gradio-app/gradio/pull/2876)
 - Added typing to several Python files in codebase by [@abidlabs](https://github.com/abidlabs) in [PR 2887](https://github.com/gradio-app/gradio/pull/2887)
@@ -1785,14 +1769,14 @@ No changes to highlight.
 - Optimize images and gifs by [@aliabd](https://github.com/aliabd) in [PR 2922](https://github.com/gradio-app/gradio/pull/2922)
 - Updated typing by [@1nF0rmed](https://github.com/1nF0rmed) in [PR 2904](https://github.com/gradio-app/gradio/pull/2904)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 - @JaySmithWpg for making their first contribution to gradio!
 - @MohamedAliRashad for making their first contribution to gradio!
 
-# Version 3.15.0
+## 3.15.0
 
-## New Features:
+### New Features:
 
 Gradio's newest plotting component `gr.LinePlot`! 📈
 
@@ -1814,48 +1798,48 @@ gr.LinePlot(stocks,
 
 By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2807](https://github.com/gradio-app/gradio/pull/2807)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixed bug where the `examples_per_page` parameter of the `Examples` component was not passed to the internal `Dataset` component by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2861](https://github.com/gradio-app/gradio/pull/2861)
 - Fixes loading Spaces that have components with default values by [@abidlabs](https://github.com/abidlabs) in [PR 2855](https://github.com/gradio-app/gradio/pull/2855)
 - Fixes flagging when `allow_flagging="auto"` in `gr.Interface()` by [@abidlabs](https://github.com/abidlabs) in [PR 2695](https://github.com/gradio-app/gradio/pull/2695)
 - Fixed bug where passing a non-list value to `gr.CheckboxGroup` would crash the entire app by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2866](https://github.com/gradio-app/gradio/pull/2866)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Added a Guide on using BigQuery with Gradio's `DataFrame` and `ScatterPlot` component,
   by [@abidlabs](https://github.com/abidlabs) in [PR 2794](https://github.com/gradio-app/gradio/pull/2794)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Fixed importing gradio can cause PIL.Image.registered_extensions() to break by `[@aliencaocao](https://github.com/aliencaocao)` in `[PR 2846](https://github.com/gradio-app/gradio/pull/2846)`
 - Fix css glitch and navigation in docs by [@aliabd](https://github.com/aliabd) in [PR 2856](https://github.com/gradio-app/gradio/pull/2856)
 - Added the ability to set `x_lim`, `y_lim` and legend positions for `gr.ScatterPlot` by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2807](https://github.com/gradio-app/gradio/pull/2807)
 - Remove footers and min-height the correct way by [@aliabd](https://github.com/aliabd) in [PR 2860](https://github.com/gradio-app/gradio/pull/2860)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.14.0
+## 3.14.0
 
-## New Features:
+### New Features:
 
-### Add Waveform Visual Support to Audio
+###### Add Waveform Visual Support to Audio
 
 Adds a `gr.make_waveform()` function that creates a waveform video by combining an audio and an optional background image by [@dawoodkhan82](http://github.com/dawoodkhan82) and [@aliabid94](http://github.com/aliabid94) in [PR 2706](https://github.com/gradio-app/gradio/pull/2706. Helpful for making audio outputs much more shareable.
 
 ![waveform screenrecording](https://user-images.githubusercontent.com/7870876/206062396-164a5e71-451a-4fe0-94a7-cbe9269d57e6.gif)
 
-### Allows Every Component to Accept an `every` Parameter
+###### Allows Every Component to Accept an `every` Parameter
 
 When a component's initial value is a function, the `every` parameter re-runs the function every `every` seconds. By [@abidlabs](https://github.com/abidlabs) in [PR 2806](https://github.com/gradio-app/gradio/pull/2806). Here's a code example:
 
@@ -1868,69 +1852,69 @@ with gr.Blocks() as demo:
 demo.queue().launch()
 ```
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixed issue where too many temporary files were created, all with randomly generated
   filepaths. Now fewer temporary files are created and are assigned a path that is a
   hash based on the file contents by [@abidlabs](https://github.com/abidlabs) in [PR 2758](https://github.com/gradio-app/gradio/pull/2758)
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.13.2
+## 3.13.2
 
-## New Features:
+### New Features:
 
 No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 
 \*No changes to highlight.
 
 -
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Improves documentation of several queuing-related parameters by [@abidlabs](https://github.com/abidlabs) in [PR 2825](https://github.com/gradio-app/gradio/pull/2825)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 - Remove h11 pinning by [@ecederstrand](https://github.com/ecederstrand) in [PR 2820](https://github.com/gradio-app/gradio/pull/2820)
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.13.1
+## 3.13.1
 
-## New Features:
+### New Features:
 
-### New Shareable Links
+###### New Shareable Links
 
 Replaces tunneling logic based on ssh port-forwarding to that based on `frp` by [XciD](https://github.com/XciD) and [Wauplin](https://github.com/Wauplin) in [PR 2509](https://github.com/gradio-app/gradio/pull/2509)
 
@@ -1945,41 +1929,41 @@ Running on public URL: https://bec81a83-5b5c-471e.gradio.live
 
 These links are a more secure and scalable way to create shareable demos!
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Allows `gr.Dataframe()` to take a `pandas.DataFrame` that includes numpy array and other types as its initial value, by [@abidlabs](https://github.com/abidlabs) in [PR 2804](https://github.com/gradio-app/gradio/pull/2804)
 - Add `altair` to requirements.txt by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2811](https://github.com/gradio-app/gradio/pull/2811)
 - Added aria-labels to icon buttons that are built into UI components by [@emilyuhde](http://github.com/emilyuhde) in [PR 2791](https://github.com/gradio-app/gradio/pull/2791)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Fixed some typos in the "Plot Component for Maps" guide by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2811](https://github.com/gradio-app/gradio/pull/2811)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 - Fixed test for IP address by [@abidlabs](https://github.com/abidlabs) in [PR 2808](https://github.com/gradio-app/gradio/pull/2808)
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Fixed typo in parameter `visible` in classes in `templates.py` by [@abidlabs](https://github.com/abidlabs) in [PR 2805](https://github.com/gradio-app/gradio/pull/2805)
 - Switched external service for getting IP address from `https://api.ipify.org` to `https://checkip.amazonaws.com/` by [@abidlabs](https://github.com/abidlabs) in [PR 2810](https://github.com/gradio-app/gradio/pull/2810)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
 - Fixed typo in parameter `visible` in classes in `templates.py` by [@abidlabs](https://github.com/abidlabs) in [PR 2805](https://github.com/gradio-app/gradio/pull/2805)
 - Switched external service for getting IP address from `https://api.ipify.org` to `https://checkip.amazonaws.com/` by [@abidlabs](https://github.com/abidlabs) in [PR 2810](https://github.com/gradio-app/gradio/pull/2810)
 
-# Version 3.13.0
+## 3.13.0
 
-## New Features:
+### New Features:
 
-### Scatter plot component
+###### Scatter plot component
 
 It is now possible to create a scatter plot natively in Gradio!
 
@@ -2014,7 +1998,7 @@ demo.launch()
 
 By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2764](https://github.com/gradio-app/gradio/pull/2764)
 
-### Support for altair plots
+###### Support for altair plots
 
 The `Plot` component can now accept altair plots as values!
 Simply return an altair plot from your event listener and gradio will display it in the front-end.
@@ -2045,7 +2029,7 @@ demo.launch()
 
 By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2741](https://github.com/gradio-app/gradio/pull/2741)
 
-### Set the background color of a Label component
+###### Set the background color of a Label component
 
 The `Label` component now accepts a `color` argument by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2736](https://github.com/gradio-app/gradio/pull/2736).
 The `color` argument should either be a valid css color name or hexadecimal string.
@@ -2082,13 +2066,13 @@ demo.queue().launch()
 
 ![label_bg_color_update](https://user-images.githubusercontent.com/41651716/204400372-80e53857-f26f-4a38-a1ae-1acadff75e89.gif)
 
-### Add Brazilian Portuguese translation
+###### Add Brazilian Portuguese translation
 
 Add Brazilian Portuguese translation (pt-BR.json) by [@pstwh](http://github.com/pstwh) in [PR 2753](https://github.com/gradio-app/gradio/pull/2753):
 
 <img width="951" alt="image" src="https://user-images.githubusercontent.com/1778297/206615305-4c52031e-3f7d-4df2-8805-a79894206911.png">
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixed issue where image thumbnails were not showing when an example directory was provided
   by [@abidlabs](https://github.com/abidlabs) in [PR 2745](https://github.com/gradio-app/gradio/pull/2745)
@@ -2097,34 +2081,34 @@ Add Brazilian Portuguese translation (pt-BR.json) by [@pstwh](http://github.com/
   dictionary inputs [@payoto](https://github.com/payoto) in [PR 2767](https://github.com/gradio-app/gradio/pull/2767)
 - Fixed bug where generating events did not finish running even if the websocket connection was closed by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2783](https://github.com/gradio-app/gradio/pull/2783).
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Images in the chatbot component are now resized if they exceed a max width by [@abidlabs](https://github.com/abidlabs) in [PR 2748](https://github.com/gradio-app/gradio/pull/2748)
 - Missing parameters have been added to `gr.Blocks().load()` by [@abidlabs](https://github.com/abidlabs) in [PR 2755](https://github.com/gradio-app/gradio/pull/2755)
 - Deindex share URLs from search by [@aliabd](https://github.com/aliabd) in [PR 2772](https://github.com/gradio-app/gradio/pull/2772)
 - Redirect old links and fix broken ones by [@aliabd](https://github.com/aliabd) in [PR 2774](https://github.com/gradio-app/gradio/pull/2774)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.12.0
+## 3.12.0
 
-## New Features:
+### New Features:
 
-### The `Chatbot` component now supports a subset of Markdown (including bold, italics, code, images)
+###### The `Chatbot` component now supports a subset of Markdown (including bold, italics, code, images)
 
 You can now pass in some Markdown to the Chatbot component and it will show up,
 meaning that you can pass in images as well! by [@abidlabs](https://github.com/abidlabs) in [PR 2731](https://github.com/gradio-app/gradio/pull/2731)
@@ -2145,7 +2129,7 @@ demo.launch()
 
 To see a more realistic example, see the new demo `/demo/chatbot_multimodal/run.py`.
 
-### Latex support
+###### Latex support
 
 Added mathtext (a subset of latex) support to gr.Markdown. Added by [@kashif](https://github.com/kashif) and [@aliabid94](https://github.com/aliabid94) in [PR 2696](https://github.com/gradio-app/gradio/pull/2696).
 
@@ -2158,7 +2142,7 @@ gr.Markdown(
     """)
 ```
 
-### Update Accordion properties from the backend
+###### Update Accordion properties from the backend
 
 You can now update the Accordion `label` and `open` status with `gr.Accordion.update` by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2690](https://github.com/gradio-app/gradio/pull/2690)
 
@@ -2185,40 +2169,40 @@ demo.launch()
 
 ![update_accordion](https://user-images.githubusercontent.com/41651716/203164176-b102eae3-babe-4986-ae30-3ab4f400cedc.gif)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixed bug where requests timeout is missing from utils.version_check() by [@yujiehecs](https://github.com/yujiehecs) in [PR 2729](https://github.com/gradio-app/gradio/pull/2729)
 - Fixed bug where so that the `File` component can properly preprocess files to "binary" byte-string format by [CoffeeVampir3](https://github.com/CoffeeVampir3) in [PR 2727](https://github.com/gradio-app/gradio/pull/2727)
 - Fixed bug to ensure that filenames are less than 200 characters even for non-English languages by [@SkyTNT](https://github.com/SkyTNT) in [PR 2685](https://github.com/gradio-app/gradio/pull/2685)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Performance improvements to docs on mobile by [@aliabd](https://github.com/aliabd) in [PR 2730](https://github.com/gradio-app/gradio/pull/2730)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Make try examples button more prominent by [@aliabd](https://github.com/aliabd) in [PR 2705](https://github.com/gradio-app/gradio/pull/2705)
 - Fix id clashes in docs by [@aliabd](https://github.com/aliabd) in [PR 2713](https://github.com/gradio-app/gradio/pull/2713)
 - Fix typos in guide docs by [@andridns](https://github.com/andridns) in [PR 2722](https://github.com/gradio-app/gradio/pull/2722)
 - Add option to `include_audio` in Video component. When `True`, for `source="webcam"` this will record audio and video, for `source="upload"` this will retain the audio in an uploaded video by [@mandargogate](https://github.com/MandarGogate) in [PR 2721](https://github.com/gradio-app/gradio/pull/2721)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 - [@andridns](https://github.com/andridns) made their first contribution in [PR 2722](https://github.com/gradio-app/gradio/pull/2722)!
 
-# Version 3.11.0
+## 3.11.0
 
-## New Features:
+### New Features:
 
-### Upload Button
+###### Upload Button
 
 There is now a new component called the `UploadButton` which is a file upload component but in button form! You can also specify what file types it should accept in the form of a list (ex: `image`, `video`, `audio`, `text`, or generic `file`). Added by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 2591](https://github.com/gradio-app/gradio/pull/2591).
 
@@ -2239,15 +2223,15 @@ with gr.Blocks() as demo:
 demo.launch()
 ```
 
-### Revamped API documentation page
+###### Revamped API documentation page
 
 New API Docs page with in-browser playground and updated aesthetics. [@gary149](https://github.com/gary149) in [PR 2652](https://github.com/gradio-app/gradio/pull/2652)
 
-### Revamped Login page
+###### Revamped Login page
 
 Previously our login page had its own CSS, had no dark mode, and had an ugly json message on the wrong credentials. Made the page more aesthetically consistent, added dark mode support, and a nicer error message. [@aliabid94](https://github.com/aliabid94) in [PR 2684](https://github.com/gradio-app/gradio/pull/2684)
 
-### Accessing the Requests Object Directly
+###### Accessing the Requests Object Directly
 
 You can now access the Request object directly in your Python function by [@abidlabs](https://github.com/abidlabs) in [PR 2641](https://github.com/gradio-app/gradio/pull/2641). This means that you can access request headers, the client IP address, and so on. In order to use it, add a parameter to your function and set its type hint to be `gr.Request`. Here's a simple example:
 
@@ -2263,12 +2247,12 @@ def echo(name, request: gr.Request):
 io = gr.Interface(echo, "textbox", "textbox").launch()
 ```
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixed bug that limited files from being sent over websockets to 16MB. The new limit
   is now 1GB by [@abidlabs](https://github.com/abidlabs) in [PR 2709](https://github.com/gradio-app/gradio/pull/2709)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Updated documentation for embedding Gradio demos on Spaces as web components by
   [@julien-c](https://github.com/julien-c) in [PR 2698](https://github.com/gradio-app/gradio/pull/2698)
@@ -2278,60 +2262,60 @@ io = gr.Interface(echo, "textbox", "textbox").launch()
 
 https://user-images.githubusercontent.com/9021060/202878400-cb16ed47-f4dd-4cb0-b2f0-102a9ff64135.mov
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Better warnings and error messages for `gr.Interface.load()` by [@abidlabs](https://github.com/abidlabs) in [PR 2694](https://github.com/gradio-app/gradio/pull/2694)
 - Add open in colab buttons to demos in docs and /demos by [@aliabd](https://github.com/aliabd) in [PR 2608](https://github.com/gradio-app/gradio/pull/2608)
 - Apply different formatting for the types in component docstrings by [@aliabd](https://github.com/aliabd) in [PR 2707](https://github.com/gradio-app/gradio/pull/2707)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.10.1
+## 3.10.1
 
-## New Features:
+### New Features:
 
 No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Passes kwargs into `gr.Interface.load()` by [@abidlabs](https://github.com/abidlabs) in [PR 2669](https://github.com/gradio-app/gradio/pull/2669)
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Clean up printed statements in Embedded Colab Mode by [@aliabid94](https://github.com/aliabid94) in [PR 2612](https://github.com/gradio-app/gradio/pull/2612)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.10.0
+## 3.10.0
 
 - Add support for `'password'` and `'email'` types to `Textbox`. [@pngwn](https://github.com/pngwn) in [PR 2653](https://github.com/gradio-app/gradio/pull/2653)
 - `gr.Textbox` component will now raise an exception if `type` is not "text", "email", or "password" [@pngwn](https://github.com/pngwn) in [PR 2653](https://github.com/gradio-app/gradio/pull/2653). This will cause demos using the deprecated `gr.Textbox(type="number")` to raise an exception.
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Updated the minimum FastApi used in tests to version 0.87 by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2647](https://github.com/gradio-app/gradio/pull/2647)
 - Fixed bug where interfaces with examples could not be loaded with `gr.Interface.load` by [@freddyaboulton](https://github.com/freddyaboulton) [PR 2640](https://github.com/gradio-app/gradio/pull/2640)
@@ -2339,37 +2323,37 @@ No changes to highlight.
 - Fixed bug where some URLs were not being recognized as valid URLs and thus were not
   loading correctly in various components by [@abidlabs](https://github.com/abidlabs) in [PR 2659](https://github.com/gradio-app/gradio/pull/2659)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Fix some typos in the embedded demo names in "05_using_blocks_like_functions.md" by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2656](https://github.com/gradio-app/gradio/pull/2656)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Add support for `'password'` and `'email'` types to `Textbox`. [@pngwn](https://github.com/pngwn) in [PR 2653](https://github.com/gradio-app/gradio/pull/2653)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.9.1
+## 3.9.1
 
-## New Features:
+### New Features:
 
 No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Only set a min height on md and html when loading by [@pngwn](https://github.com/pngwn) in [PR 2623](https://github.com/gradio-app/gradio/pull/2623)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - See docs for the latest gradio commit to main as well the latest pip release:
 
@@ -2377,32 +2361,32 @@ No changes to highlight.
 
 - Modified the "Connecting To a Database Guide" to use `pd.read_sql` as opposed to low-level postgres connector by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2604](https://github.com/gradio-app/gradio/pull/2604)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Dropdown for seeing docs as latest or main by [@aliabd](https://github.com/aliabd) in [PR 2544](https://github.com/gradio-app/gradio/pull/2544)
 - Allow `gr.Templates` to accept parameters to override the defaults by [@abidlabs](https://github.com/abidlabs) in [PR 2600](https://github.com/gradio-app/gradio/pull/2600)
 - Components now throw a `ValueError()` if constructed with invalid parameters for `type` or `source` (for components that take those parameters) in [PR 2610](https://github.com/gradio-app/gradio/pull/2610)
 - Allow auth with using queue by [@GLGDLY](https://github.com/GLGDLY) in [PR 2611](https://github.com/gradio-app/gradio/pull/2611)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.9
+## 3.9
 
-## New Features:
+### New Features:
 
 - Gradio is now embedded directly in colab without requiring the share link by [@aliabid94](https://github.com/aliabid94) in [PR 2455](https://github.com/gradio-app/gradio/pull/2455)
 
-### Calling functions by api_name in loaded apps
+###### Calling functions by api_name in loaded apps
 
 When you load an upstream app with `gr.Blocks.load`, you can now specify which fn
 to call with the `api_name` parameter.
@@ -2415,44 +2399,44 @@ german = english_translator("My name is Freddy", api_name='translate-to-german')
 
 The `api_name` parameter will take precedence over the `fn_index` parameter.
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixed bug where None could not be used for File,Model3D, and Audio examples by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2588](https://github.com/gradio-app/gradio/pull/2588)
 - Fixed links in Plotly map guide + demo by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 2578](https://github.com/gradio-app/gradio/pull/2578)
 - `gr.Blocks.load()` now correctly loads example files from Spaces [@abidlabs](https://github.com/abidlabs) in [PR 2594](https://github.com/gradio-app/gradio/pull/2594)
 - Fixed bug when image clear started upload dialog [@mezotaken](https://github.com/mezotaken) in [PR 2577](https://github.com/gradio-app/gradio/pull/2577)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Added a Guide on how to configure the queue for maximum performance by [@abidlabs](https://github.com/abidlabs) in [PR 2558](https://github.com/gradio-app/gradio/pull/2558)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Add `api_name` to `Blocks.__call__` by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2593](https://github.com/gradio-app/gradio/pull/2593)
 - Update queue with using deque & update requirements by [@GLGDLY](https://github.com/GLGDLY) in [PR 2428](https://github.com/gradio-app/gradio/pull/2428)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.8.2
+## 3.8.2
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Ensure gradio apps embedded via spaces use the correct endpoint for predictions. [@pngwn](https://github.com/pngwn) in [PR 2567](https://github.com/gradio-app/gradio/pull/2567)
 - Ensure gradio apps embedded via spaces use the correct websocket protocol. [@pngwn](https://github.com/pngwn) in [PR 2571](https://github.com/gradio-app/gradio/pull/2571)
 
-## New Features:
+### New Features:
 
-### Running Events Continuously
+###### Running Events Continuously
 
 Gradio now supports the ability to run an event continuously on a fixed schedule. To use this feature,
 pass `every=# of seconds` to the event definition. This will run the event every given number of seconds!
@@ -2498,70 +2482,70 @@ demo.queue().launch()
 
 ![live_demo](https://user-images.githubusercontent.com/41651716/198357377-633ce460-4e31-47bd-8202-1440cdd6fe19.gif)
 
-## Bug Fixes:
+### Bug Fixes:
 
 No changes to highlight.
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Explained how to set up `queue` and `auth` when working with reload mode by by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3089](https://github.com/gradio-app/gradio/pull/3089)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Allows loading private Spaces by passing an an `api_key` to `gr.Interface.load()`
   by [@abidlabs](https://github.com/abidlabs) in [PR 2568](https://github.com/gradio-app/gradio/pull/2568)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.8
+## 3.8
 
-## New Features:
+### New Features:
 
 - Allows event listeners to accept a single dictionary as its argument, where the keys are the components and the values are the component values. This is set by passing the input components in the event listener as a set instead of a list. [@aliabid94](https://github.com/aliabid94) in [PR 2550](https://github.com/gradio-app/gradio/pull/2550)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fix whitespace issue when using plotly. [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 2548](https://github.com/gradio-app/gradio/pull/2548)
 - Apply appropriate alt text to all gallery images. [@camenduru](https://github.com/camenduru) in [PR 2358](https://github.com/gradio-app/gradio/pull/2538)
 - Removed erroneous tkinter import in gradio.blocks by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2555](https://github.com/gradio-app/gradio/pull/2555)
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Added the `every` keyword to event listeners that runs events on a fixed schedule by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2512](https://github.com/gradio-app/gradio/pull/2512)
 - Fix whitespace issue when using plotly. [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 2548](https://github.com/gradio-app/gradio/pull/2548)
 - Apply appropriate alt text to all gallery images. [@camenduru](https://github.com/camenduru) in [PR 2358](https://github.com/gradio-app/gradio/pull/2538)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.7
+## 3.7
 
-## New Features:
+### New Features:
 
-### Batched Functions
+###### Batched Functions
 
 Gradio now supports the ability to pass _batched_ functions. Batched functions are just
 functions which take in a list of inputs and return a list of predictions.
@@ -2607,7 +2591,7 @@ In the example above, 16 requests could be processed in parallel (for a total in
 time of 5 seconds), instead of each request being processed separately (for a total
 inference time of 80 seconds).
 
-### Upload Event
+###### Upload Event
 
 `Video`, `Audio`, `Image`, and `File` components now support a `upload()` event that is triggered when a user uploads a file into any of these components.
 
@@ -2625,7 +2609,7 @@ with gr.Blocks() as demo:
     input_video.upload(lambda : None, None, output_video)
 ```
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixes issue where plotly animations, interactivity, titles, legends, were not working properly. [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 2486](https://github.com/gradio-app/gradio/pull/2486)
 - Prevent requests to the `/api` endpoint from skipping the queue if the queue is enabled for that event by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2493](https://github.com/gradio-app/gradio/pull/2493)
@@ -2635,19 +2619,19 @@ with gr.Blocks() as demo:
 - Properly dequeue cancelled events when multiple apps are rendered by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2540](https://github.com/gradio-app/gradio/pull/2540)
 - Fixes videos being cropped due to height/width params not being used [@hannahblair](https://github.com/hannahblair) in [PR 4946](https://github.com/gradio-app/gradio/pull/4946)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Added an example interactive dashboard to the "Tabular & Plots" section of the Demos page by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2508](https://github.com/gradio-app/gradio/pull/2508)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Fixes the error message if a user builds Gradio locally and tries to use `share=True` by [@abidlabs](https://github.com/abidlabs) in [PR 2502](https://github.com/gradio-app/gradio/pull/2502)
 - Allows the render() function to return self by [@Raul9595](https://github.com/Raul9595) in [PR 2514](https://github.com/gradio-app/gradio/pull/2514)
@@ -2659,15 +2643,15 @@ No changes to highlight.
   try to use `Series` or `Parallel` with `Blocks` by [@abidlabs](https://github.com/abidlabs) in [PR 2543](https://github.com/gradio-app/gradio/pull/2543)
 - Adds support for audio samples that are in `float64`, `float16`, or `uint16` formats by [@abidlabs](https://github.com/abidlabs) in [PR 2545](https://github.com/gradio-app/gradio/pull/2545)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.6
+## 3.6
 
-## New Features:
+### New Features:
 
-### Cancelling Running Events
+###### Cancelling Running Events
 
 Running events can be cancelled when other events are triggered! To test this feature, pass the `cancels` parameter to the event listener.
 For this feature to work, the queue must be enabled.
@@ -2731,7 +2715,7 @@ gr.Interface(iteration,
 
 ![stop_interface_rl](https://user-images.githubusercontent.com/41651716/195952883-e7ca4235-aae3-4852-8f28-96d01d0c5822.gif)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Add loading status tracker UI to HTML and Markdown components. [@pngwn](https://github.com/pngwn) in [PR 2474](https://github.com/gradio-app/gradio/pull/2474)
 - Fixed videos being mirrored in the front-end if source is not webcam by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2475](https://github.com/gradio-app/gradio/pull/2475)
@@ -2739,32 +2723,32 @@ gr.Interface(iteration,
 - Removes special characters from temporary filenames so that the files can be served by components [@abidlabs](https://github.com/abidlabs) in [PR 2480](https://github.com/gradio-app/gradio/pull/2480)
 - Fixed infinite reload loop when mounting gradio as a sub application by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2477](https://github.com/gradio-app/gradio/pull/2477)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Adds a demo to show how a sound alert can be played upon completion of a prediction by [@abidlabs](https://github.com/abidlabs) in [PR 2478](https://github.com/gradio-app/gradio/pull/2478)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Enable running events to be cancelled from other events by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2433](https://github.com/gradio-app/gradio/pull/2433)
 - Small fix for version check before reuploading demos by [@aliabd](https://github.com/aliabd) in [PR 2469](https://github.com/gradio-app/gradio/pull/2469)
 - Add loading status tracker UI to HTML and Markdown components. [@pngwn](https://github.com/pngwn) in [PR 2400](https://github.com/gradio-app/gradio/pull/2474)
 - Add clear button for timeseries component [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 2487](https://github.com/gradio-app/gradio/pull/2487)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.5
+## 3.5
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Ensure that Gradio does not take control of the HTML page title when embedding a gradio app as a web component, this behaviour flipped by adding `control_page_title="true"` to the webcomponent. [@pngwn](https://github.com/pngwn) in [PR 2400](https://github.com/gradio-app/gradio/pull/2400)
 - Decreased latency in iterative-output demos by making the iteration asynchronous [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2409](https://github.com/gradio-app/gradio/pull/2409)
@@ -2777,24 +2761,24 @@ No changes to highlight.
 
   [@pngwn](https://github.com/pngwn) in [PR 2459](https://github.com/gradio-app/gradio/pull/2459)
 
-## New Features:
+### New Features:
 
 - When an `Image` component is set to `source="upload"`, it is now possible to drag and drop and image to replace a previously uploaded image by [@pngwn](https://github.com/pngwn) in [PR 1711](https://github.com/gradio-app/gradio/issues/1711)
 - The `gr.Dataset` component now accepts `HTML` and `Markdown` components by [@abidlabs](https://github.com/abidlabs) in [PR 2437](https://github.com/gradio-app/gradio/pull/2437)
 
-## Documentation Changes:
+### Documentation Changes:
 
 - Improved documentation for the `gr.Dataset` component by [@abidlabs](https://github.com/abidlabs) in [PR 2437](https://github.com/gradio-app/gradio/pull/2437)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 - The `Carousel` component is officially deprecated. Since gradio 3.0, code containing the `Carousel` component would throw warnings. As of the next release, the `Carousel` component will raise an exception.
 
-## Full Changelog:
+### Full Changelog:
 
 - Speeds up Gallery component by using temporary files instead of base64 representation in the front-end by [@proxyphi](https://github.com/proxyphi), [@pngwn](https://github.com/pngwn), and [@abidlabs](https://github.com/abidlabs) in [PR 2265](https://github.com/gradio-app/gradio/pull/2265)
 - Fixed some embedded demos in the guides by not loading the gradio web component in some guides by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2403](https://github.com/gradio-app/gradio/pull/2403)
@@ -2812,21 +2796,21 @@ No changes to highlight.
 - Fix embedded interfaces on touch screen devices by [@aliabd](https://github.com/aliabd) in [PR 2457](https://github.com/gradio-app/gradio/pull/2457)
 - Upload all demos to spaces by [@aliabd](https://github.com/aliabd) in [PR 2281](https://github.com/gradio-app/gradio/pull/2281)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.4.1
+## 3.4.1
 
-## New Features:
+### New Features:
 
-### 1. See Past and Upcoming Changes in the Release History 👀
+###### 1. See Past and Upcoming Changes in the Release History 👀
 
 You can now see gradio's release history directly on the website, and also keep track of upcoming changes. Just go [here](https://gradio.app/changelog/).
 
 ![release-history](https://user-images.githubusercontent.com/9021060/193145458-3de699f7-7620-45de-aa73-a1c1b9b96257.gif)
 
-## Bug Fixes:
+### Bug Fixes:
 
 1. Fix typo in guide image path by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2357](https://github.com/gradio-app/gradio/pull/2357)
 2. Raise error if Blocks has duplicate component with same IDs by [@abidlabs](https://github.com/abidlabs) in [PR 2359](https://github.com/gradio-app/gradio/pull/2359)
@@ -2836,7 +2820,7 @@ You can now see gradio's release history directly on the website, and also keep
 6. Fix audio streaming, which was previously choppy in [PR 2351](https://github.com/gradio-app/gradio/pull/2351). Big thanks to [@yannickfunk](https://github.com/yannickfunk) for the proposed solution.
 7. Fix bug where new typeable slider doesn't respect the minimum and maximum values [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 2380](https://github.com/gradio-app/gradio/pull/2380)
 
-## Documentation Changes:
+### Documentation Changes:
 
 1. New Guide: Connecting to a Database 🗄️
 
@@ -2848,15 +2832,15 @@ You can now see gradio's release history directly on the website, and also keep
 
 3. Small fixes to docs for `Image` component by [@abidlabs](https://github.com/abidlabs) in [PR 2372](https://github.com/gradio-app/gradio/pull/2372)
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - Create a guide on how to connect an app to a database hosted on the cloud by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2341](https://github.com/gradio-app/gradio/pull/2341)
 - Removes `analytics` dependency by [@abidlabs](https://github.com/abidlabs) in [PR 2347](https://github.com/gradio-app/gradio/pull/2347)
@@ -2876,15 +2860,15 @@ No changes to highlight.
 - Fix bug where errors would cause apps run in reload mode to hang forever by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2394](https://github.com/gradio-app/gradio/pull/2394)
 - Fix bug where new typeable slider doesn't respect the minimum and maximum values [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 2380](https://github.com/gradio-app/gradio/pull/2380)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 3.4
+## 3.4
 
-## New Features:
+### New Features:
 
-### 1. Gallery Captions 🖼️
+###### 1. Gallery Captions 🖼️
 
 You can now pass captions to images in the Gallery component. To do so you need to pass a {List} of (image, {str} caption) tuples. This is optional and the component also accepts just a list of the images.
 
@@ -2907,13 +2891,13 @@ demo.launch()
 
 <img src="https://user-images.githubusercontent.com/9021060/192399521-7360b1a9-7ce0-443e-8e94-863a230a7dbe.gif" alt="gallery_captions" width="1000"/>
 
-### 2. Type Values into the Slider 🔢
+###### 2. Type Values into the Slider 🔢
 
 You can now type values directly on the Slider component! Here's what it looks like:
 
 ![type-slider](https://user-images.githubusercontent.com/9021060/192399877-76b662a1-fede-4417-a932-fc15f0da7360.gif)
 
-### 3. Better Sketching and Inpainting 🎨
+###### 3. Better Sketching and Inpainting 🎨
 
 We've made a lot of changes to our Image component so that it can support better sketching and inpainting.
 
@@ -2961,7 +2945,7 @@ demo.launch()
 
 As well as other fixes
 
-## Bug Fixes:
+### Bug Fixes:
 
 1. Fix bug where max concurrency count is not respected in queue by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2286](https://github.com/gradio-app/gradio/pull/2286)
 2. fix : queue could be blocked by [@SkyTNT](https://github.com/SkyTNT) in [PR 2288](https://github.com/gradio-app/gradio/pull/2288)
@@ -2971,7 +2955,7 @@ As well as other fixes
 6. Added support for URLs for Video, Audio, and Image by [@abidlabs](https://github.com/abidlabs) in [PR 2256](https://github.com/gradio-app/gradio/pull/2256)
 7. Add documentation about how to create and use the Gradio FastAPI app by [@abidlabs](https://github.com/abidlabs) in [PR 2263](https://github.com/gradio-app/gradio/pull/2263)
 
-## Documentation Changes:
+### Documentation Changes:
 
 1. Adding a Playground Tab to the Website by [@aliabd](https://github.com/aliabd) in [PR 1860](https://github.com/gradio-app/gradio/pull/1860)
 2. Gradio for Tabular Data Science Workflows Guide by [@merveenoyan](https://github.com/merveenoyan) in [PR 2199](https://github.com/gradio-app/gradio/pull/2199)
@@ -2979,12 +2963,12 @@ As well as other fixes
 4. Update 2)key_features.md by [@voidxd](https://github.com/voidxd) in [PR 2326](https://github.com/gradio-app/gradio/pull/2326)
 5. Add docs to blocks context postprocessing function by [@Ian-GL](https://github.com/Ian-GL) in [PR 2332](https://github.com/gradio-app/gradio/pull/2332)
 
-## Testing and Infrastructure Changes
+### Testing and Infrastructure Changes
 
 1. Website fixes and refactoring by [@aliabd](https://github.com/aliabd) in [PR 2280](https://github.com/gradio-app/gradio/pull/2280)
 2. Don't deploy to spaces on release by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2313](https://github.com/gradio-app/gradio/pull/2313)
 
-## Full Changelog:
+### Full Changelog:
 
 - Website fixes and refactoring by [@aliabd](https://github.com/aliabd) in [PR 2280](https://github.com/gradio-app/gradio/pull/2280)
 - Fix bug where max concurrency count is not respected in queue by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2286](https://github.com/gradio-app/gradio/pull/2286)
@@ -3006,16 +2990,16 @@ As well as other fixes
 - Add captions to galleries by [@aliabid94](https://github.com/aliabid94) in [PR 2284](https://github.com/gradio-app/gradio/pull/2284)
 - Typeable value on gradio.Slider by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 2329](https://github.com/gradio-app/gradio/pull/2329)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 - [@SkyTNT](https://github.com/SkyTNT) made their first contribution in [PR 2288](https://github.com/gradio-app/gradio/pull/2288)
 - [@voidxd](https://github.com/voidxd) made their first contribution in [PR 2326](https://github.com/gradio-app/gradio/pull/2326)
 
-# Version 3.3
+## 3.3
 
-## New Features:
+### New Features:
 
-### 1. Iterative Outputs ⏳
+###### 1. Iterative Outputs ⏳
 
 You can now create an iterative output simply by having your function return a generator!
 
@@ -3030,7 +3014,7 @@ def predict(steps, seed):
 
 ![example](https://user-images.githubusercontent.com/9021060/189086273-f5e7087d-71fa-4158-90a9-08e84da0421c.mp4)
 
-### 2. Accordion Layout 🆕
+###### 2. Accordion Layout 🆕
 
 This version of Gradio introduces a new layout component to Blocks: the Accordion. Wrap your elements in a neat, expandable layout that allows users to toggle them as needed.
 
@@ -3043,7 +3027,7 @@ with gr.Accordion("open up"):
 
 ![accordion](https://user-images.githubusercontent.com/9021060/189088465-f0ffd7f0-fc6a-42dc-9249-11c5e1e0529b.gif)
 
-### 3. Skops Integration 📈
+###### 3. Skops Integration 📈
 
 Our new integration with [skops](https://huggingface.co/blog/skops) allows you to load tabular classification and regression models directly from the [hub](https://huggingface.co/models).
 
@@ -3056,23 +3040,23 @@ gr.Interface.load("models/scikit-learn/tabular-playground").launch()
 
 ![187936493-5c90c01d-a6dd-400f-aa42-833a096156a1](https://user-images.githubusercontent.com/9021060/189090519-328fbcb4-120b-43c8-aa54-d6fccfa6b7e8.png)
 
-## Bug Fixes:
+### Bug Fixes:
 
 No changes to highlight.
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 - safari fixes by [@pngwn](https://github.com/pngwn) in [PR 2138](https://github.com/gradio-app/gradio/pull/2138)
 - Fix roundedness and form borders by [@aliabid94](https://github.com/aliabid94) in [PR 2147](https://github.com/gradio-app/gradio/pull/2147)
@@ -3093,17 +3077,17 @@ No changes to highlight.
 - use correct MIME type for js-script file by [@daspartho](https://github.com/daspartho) in [PR 2200](https://github.com/gradio-app/gradio/pull/2200)
 - Add accordion component by [@aliabid94](https://github.com/aliabid94) in [PR 2208](https://github.com/gradio-app/gradio/pull/2208)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 - [@lamhoangtung](https://github.com/lamhoangtung) made their first contribution in [PR 2176](https://github.com/gradio-app/gradio/pull/2176)
 - [@cobryan05](https://github.com/cobryan05) made their first contribution in [PR 2170](https://github.com/gradio-app/gradio/pull/2170)
 - [@daspartho](https://github.com/daspartho) made their first contribution in [PR 2200](https://github.com/gradio-app/gradio/pull/2200)
 
-# Version 3.2
+## 3.2
 
-## New Features:
+### New Features:
 
-### 1. Improvements to Queuing 🥇
+###### 1. Improvements to Queuing 🥇
 
 We've implemented a brand new queuing system based on **web sockets** instead of HTTP long polling. Among other things, this allows us to manage queue sizes better on Hugging Face Spaces. There are also additional queue-related parameters you can add:
 
@@ -3125,7 +3109,7 @@ demo.launch()
 
 - If a user closes their tab / browser, they leave the queue, which means the demo will run faster for everyone else
 
-### 2. Fixes to Examples
+###### 2. Fixes to Examples
 
 - Dataframe examples will render properly, and look much clearer in the UI: (thanks to PR #2125)
 
@@ -3137,7 +3121,7 @@ demo.launch()
 
 - Other fixes in PR #2131 and #2064 make it easier to design and use Examples
 
-### 3. Component Fixes 🧱
+###### 3. Component Fixes 🧱
 
 - Specify the width and height of an image in its style tag (thanks to PR #2133)
 
@@ -3153,7 +3137,7 @@ components.Image().style(height=260, width=300)
 
 - Improvements to State in PR #2100
 
-### 4. Ability to Randomize Input Sliders and Reload Data whenever the Page Loads
+###### 4. Ability to Randomize Input Sliders and Reload Data whenever the Page Loads
 
 - In some cases, you want to be able to show a different set of input data to every user as they load the page app. For example, you might want to randomize the value of a "seed" `Slider` input. Or you might want to show a `Textbox` with the current date. We now supporting passing _functions_ as the default value in input components. When you pass in a function, it gets **re-evaluated** every time someone loads the demo, allowing you to reload / change data for different users.
 
@@ -3179,11 +3163,11 @@ demo = gr.Interface(lambda x:x, gr.Slider(0, 10, randomize=True), "number")
 demo.launch()
 ```
 
-### 5. New Guide 🖊️
+###### 5. New Guide 🖊️
 
 - [Gradio and W&B Integration](https://gradio.app/Gradio_and_Wandb_Integration/)
 
-## Full Changelog:
+### Full Changelog:
 
 - Reset components to original state by setting value to None by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2044](https://github.com/gradio-app/gradio/pull/2044)
 - Cleaning up the way data is processed for components by [@abidlabs](https://github.com/abidlabs) in [PR 1967](https://github.com/gradio-app/gradio/pull/1967)
@@ -3210,17 +3194,17 @@ demo.launch()
 - Some enhancements to `gr.Examples` by [@abidlabs](https://github.com/abidlabs) in [PR 2131](https://github.com/gradio-app/gradio/pull/2131)
 - Image size fix by [@aliabid94](https://github.com/aliabid94) in [PR 2133](https://github.com/gradio-app/gradio/pull/2133)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 - [@chrisemezue](https://github.com/chrisemezue) made their first contribution in [PR 1821](https://github.com/gradio-app/gradio/pull/1821)
 - [@apolinario](https://github.com/apolinario) made their first contribution in [PR 2076](https://github.com/gradio-app/gradio/pull/2076)
 - [@codedealer](https://github.com/codedealer) made their first contribution in [PR 2108](https://github.com/gradio-app/gradio/pull/2108)
 
-# Version 3.1
+## 3.1
 
-## New Features:
+### New Features:
 
-### 1. Embedding Demos on Any Website 💻
+###### 1. Embedding Demos on Any Website 💻
 
 With PR #1444, Gradio is now distributed as a web component. This means demos can be natively embedded on websites. You'll just need to add two lines: one to load the gradio javascript, and one to link to the demos backend.
 
@@ -3240,7 +3224,7 @@ But you can also embed demos that are running anywhere, you just need to link th
 
 Read more in the [Embedding Gradio Demos](https://gradio.app/embedding_gradio_demos) guide.
 
-### 2. Reload Mode 👨‍💻
+###### 2. Reload Mode 👨‍💻
 
 Reload mode helps developers create gradio demos faster by automatically reloading the demo whenever the code changes. It can support development on Python IDEs (VS Code, PyCharm, etc), the terminal, as well as Jupyter notebooks.
 
@@ -3256,7 +3240,7 @@ If you're working from a Jupyter or Colab Notebook, use these magic commands ins
 
 ![Blocks](https://user-images.githubusercontent.com/9021060/178986488-ed378cc8-5141-4330-ba41-672b676863d0.gif)
 
-### 3. Inpainting Support on `gr.Image()` 🎨
+###### 3. Inpainting Support on `gr.Image()` 🎨
 
 We updated the Image component to add support for inpainting demos. It works by adding `tool="sketch"` as a parameter, that passes both an image and a sketchable mask to your prediction function.
 
@@ -3264,7 +3248,7 @@ Here's an example from the [LAMA space](https://huggingface.co/spaces/akhaliq/la
 
 ![FXApVlFVsAALSD-](https://user-images.githubusercontent.com/9021060/178989479-549867c8-7fb0-436a-a97d-1e91c9f5e611.jpeg)
 
-### 4. Markdown and HTML support in Dataframes 🔢
+###### 4. Markdown and HTML support in Dataframes 🔢
 
 We upgraded the Dataframe component in PR #1684 to support rendering Markdown and HTML inside the cells.
 
@@ -3272,7 +3256,7 @@ This means you can build Dataframes that look like the following:
 
 ![image (8)](https://user-images.githubusercontent.com/9021060/178991233-41cb07a5-e7a3-433e-89b8-319bc78eb9c2.png)
 
-### 5. `gr.Examples()` for Blocks 🧱
+###### 5. `gr.Examples()` for Blocks 🧱
 
 We've added the `gr.Examples` component helper to allow you to add examples to any Blocks demo. This class is a wrapper over the `gr.Dataset` component.
 
@@ -3285,13 +3269,13 @@ gr.Examples takes two required parameters:
 
 You can read more in the [Examples docs](https://gradio.app/docs/#examples) or the [Adding Examples to your Demos guide](https://gradio.app/adding_examples_to_your_app/).
 
-### 6. Fixes to Audio Streaming
+###### 6. Fixes to Audio Streaming
 
 With [PR 1828](https://github.com/gradio-app/gradio/pull/1828) we now hide the status loading animation, as well as remove the echo in streaming. Check out the [stream_audio](https://github.com/gradio-app/gradio/blob/main/demo/stream_audio/run.py) demo for more or read through our [Real Time Speech Recognition](https://gradio.app/real_time_speech_recognition/) guide.
 
 <img width="785" alt="Screen Shot 2022-07-19 at 6 02 35 PM" src="https://user-images.githubusercontent.com/9021060/179808136-9e84502c-f9ee-4f30-b5e9-1086f678fe91.png">
 
-## Full Changelog:
+### Full Changelog:
 
 - File component: list multiple files and allow for download #1446 by [@dawoodkhan82](https://github.com/dawoodkhan82) in [PR 1681](https://github.com/gradio-app/gradio/pull/1681)
 - Add ColorPicker to docs by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 1768](https://github.com/gradio-app/gradio/pull/1768)
@@ -3307,17 +3291,17 @@ With [PR 1828](https://github.com/gradio-app/gradio/pull/1828) we now hide the s
 - Remove usage of deprecated gr.inputs and gr.outputs from website by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 1796](https://github.com/gradio-app/gradio/pull/1796)
 - Some cleanups to the docs page by [@abidlabs](https://github.com/abidlabs) in [PR 1822](https://github.com/gradio-app/gradio/pull/1822)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 - [@nhankiet](https://github.com/nhankiet) made their first contribution in [PR 1819](https://github.com/gradio-app/gradio/pull/1819)
 
-# Version 3.0
+## 3.0
 
-### 🔥 Gradio 3.0 is the biggest update to the library, ever.
+###### 🔥 Gradio 3.0 is the biggest update to the library, ever.
 
-## New Features:
+### New Features:
 
-### 1. Blocks 🧱
+###### 1. Blocks 🧱
 
 Blocks is a new, low-level API that allows you to have full control over the data flows and layout of your application. It allows you to build very complex, multi-step applications. For example, you might want to:
 
@@ -3356,25 +3340,25 @@ demo.launch()
 
 Read our [Introduction to Blocks](http://gradio.app/introduction_to_blocks/) guide for more, and join the 🎈 [Gradio Blocks Party](https://huggingface.co/spaces/Gradio-Blocks/README)!
 
-### 2. Our Revamped Design 🎨
+###### 2. Our Revamped Design 🎨
 
 We've upgraded our design across the entire library: from components, and layouts all the way to dark mode.
 
 ![kitchen_sink](https://user-images.githubusercontent.com/9021060/168686333-7a6e3096-3e23-4309-abf2-5cd7736e0463.gif)
 
-### 3. A New Website 💻
+###### 3. A New Website 💻
 
 We've upgraded [gradio.app](https://gradio.app) to make it cleaner, faster and easier to use. Our docs now come with components and demos embedded directly on the page. So you can quickly get up to speed with what you're looking for.
 
 ![website](https://user-images.githubusercontent.com/9021060/168687191-10d6a3bd-101f-423a-8193-48f47a5e077d.gif)
 
-### 4. New Components: Model3D, Dataset, and More..
+###### 4. New Components: Model3D, Dataset, and More..
 
 We've introduced a lot of new components in `3.0`, including `Model3D`, `Dataset`, `Markdown`, `Button` and `Gallery`. You can find all the components and play around with them [here](https://gradio.app/docs/#components).
 
 ![Model3d](https://user-images.githubusercontent.com/9021060/168689062-6ad77151-8cc5-467d-916c-f7c78e52ec0c.gif)
 
-## Full Changelog:
+### Full Changelog:
 
 - Gradio dash fe by [@pngwn](https://github.com/pngwn) in [PR 807](https://github.com/gradio-app/gradio/pull/807)
 - Blocks components by [@FarukOzderim](https://github.com/FarukOzderim) in [PR 765](https://github.com/gradio-app/gradio/pull/765)
@@ -3585,10 +3569,10 @@ We've introduced a lot of new components in `3.0`, including `Model3D`, `Dataset
 - gif by [@abidlabs](https://github.com/abidlabs) in [PR 1296](https://github.com/gradio-app/gradio/pull/1296)
 - Allow decoding headerless b64 string [@1lint](https://github.com/1lint) in [PR 4031](https://github.com/gradio-app/gradio/pull/4031)
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 - [@JefferyChiang](https://github.com/JefferyChiang) made their first contribution in [PR 1004](https://github.com/gradio-app/gradio/pull/1004)
 - [@NimaBoscarino](https://github.com/NimaBoscarino) made their first contribution in [PR 1000](https://github.com/gradio-app/gradio/pull/1000)
 - [@ronvoluted](https://github.com/ronvoluted) made their first contribution in [PR 1050](https://github.com/gradio-app/gradio/pull/1050)
 - [@radames](https://github.com/radames) made their first contribution in [PR 1074](https://github.com/gradio-app/gradio/pull/1074)
-- [@freddyaboulton](https://github.com/freddyaboulton) made their first contribution in [PR 1085](https://github.com/gradio-app/gradio/pull/1085)
+- [@freddyaboulton](https://github.com/freddyaboulton) made their first contribution in [PR 1085](https://github.com/gradio-app/gradio/pull/1085)
\ No newline at end of file
diff --git a/build_pypi.sh b/build_pypi.sh
new file mode 100755
index 0000000000..68a6d6e5e3
--- /dev/null
+++ b/build_pypi.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+set -e
+
+cd "$(dirname ${0})"
+source scripts/helpers.sh
+
+pnpm_required
+aws_required
+
+# You should update the version in version.txt before running this script
+new_version="$(cat gradio/version.txt)"
+GRADIO_VERSION=$new_version
+
+rm -rf gradio/templates/frontend
+rm -rf gradio/templates/cdn
+pnpm i
+GRADIO_VERSION=$new_version pnpm build
+GRADIO_VERSION=$new_version pnpm build:cdn
+aws s3 cp gradio/templates/cdn "s3://gradio/${new_version}/" --recursive
+cp gradio/templates/cdn/index.html gradio/templates/frontend/share.html
+
+rm -rf dist/*
+rm -rf build/*
+python3 -m build
diff --git a/client/js/package.json b/client/js/package.json
index c59e1aa9a0..1129c0d6fa 100644
--- a/client/js/package.json
+++ b/client/js/package.json
@@ -28,5 +28,6 @@
 	},
 	"engines": {
 		"node": ">=18.0.0"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/client/python/CHANGELOG.md b/client/python/CHANGELOG.md
index ba42853556..03d3a1fe21 100644
--- a/client/python/CHANGELOG.md
+++ b/client/python/CHANGELOG.md
@@ -1,300 +1,282 @@
-# Upcoming Release
+# gradio_client
 
-## New Features:
-
-No changes to highlight
-
-## Bug Fixes:
-
-No changes to highlight
-
-## Breaking Changes:
-
-No changes to highlight.
-
-## Full Changelog:
-
-No changes to highlight.
-
-# Version 0.2.10
-
-## New Features:
+### New Features:
 
 - Endpoints that return layout components are now properly handled in the `submit` and `view_api` methods. Output layout components are not returned by the API but all other components are (excluding `gr.State`). By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4871](https://github.com/gradio-app/gradio/pull/4871)
 
 
-## Bug Fixes:
+### Bug Fixes:
 
 No changes to highlight
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-# Version 0.2.9
+# 0.2.9
 
-## New Features:
+### New Features:
 
 No changes to highlight
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fix bug determining the api name when a demo has `api_name=False` by [@freddyboulton](https://github.com/freddyaboulton) in [PR 4886](https://github.com/gradio-app/gradio/pull/4886)
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 * Pinned dependencies to major versions to reduce the likelihood of a broken `gradio_client` due to changes in downstream dependencies by [@abidlabs](https://github.com/abidlabs) in [PR 4885](https://github.com/gradio-app/gradio/pull/4885)
 
-# Version 0.2.8
+# 0.2.8
 
-## New Features:
+### New Features:
 
 - Support loading gradio apps where `api_name=False` by [@abidlabs](https://github.com/abidlabs) in [PR 4683](https://github.com/gradio-app/gradio/pull/4683)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fix bug where space duplication would error if the demo has cpu-basic hardware by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4583](https://github.com/gradio-app/gradio/pull/4583)
 - Fixes and optimizations to URL/download functions by [@akx](https://github.com/akx) in [PR 4695](https://github.com/gradio-app/gradio/pull/4695)
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-# Version 0.2.7
+# 0.2.7
 
-## New Features:
+### New Features:
 
 - The output directory for files downloaded via the Client can now be set by the `output_dir` parameter in `Client` by [@abidlabs](https://github.com/abidlabs) in [PR 4501](https://github.com/gradio-app/gradio/pull/4501)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - The output directory for files downloaded via the Client are now set to a temporary directory by default (instead of the working directory in some cases) by [@abidlabs](https://github.com/abidlabs) in [PR 4501](https://github.com/gradio-app/gradio/pull/4501)
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-# Version 0.2.6
+# 0.2.6
 
-## New Features:
+### New Features:
 
 No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixed bug file deserialization didn't preserve all file extensions by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4440](https://github.com/gradio-app/gradio/pull/4440)
 - Fixed bug where mounted apps could not be called via the client by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4435](https://github.com/gradio-app/gradio/pull/4435)
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-# Version 0.2.5
+# 0.2.5
 
-## New Features:
+### New Features:
 
 No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixes parameter names not showing underscores by [@abidlabs](https://github.com/abidlabs) in [PR 4230](https://github.com/gradio-app/gradio/pull/4230)
 - Fixes issue in which state was not handled correctly if `serialize=False` by [@abidlabs](https://github.com/abidlabs) in [PR 4230](https://github.com/gradio-app/gradio/pull/4230)
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-# Version 0.2.4
+# 0.2.4
 
-## Bug Fixes:
+### Bug Fixes:
 - Fixes missing serialization classes for several components: `Barplot`, `Lineplot`, `Scatterplot`, `AnnotatedImage`, `Interpretation` by [@abidlabs](https://github.com/abidlabs) in [PR 4167](https://github.com/gradio-app/gradio/pull/4167)
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 0.2.3
+# 0.2.3
 
-## New Features:
+### New Features:
 
 No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 - Fix example inputs for `gr.File(file_count='multiple')` output components by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4153](https://github.com/gradio-app/gradio/pull/4153)
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 0.2.2
+# 0.2.2
 
-## New Features:
+### New Features:
 
 No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Only send request to `/info` route if demo version is above `3.28.3` by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4109](https://github.com/gradio-app/gradio/pull/4109)
 
 
-## Other Changes:
+### Other Changes:
 
 - Fix bug in test from gradio 3.29.0 refactor by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4138](https://github.com/gradio-app/gradio/pull/4138)
 
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
 
-# Version 0.2.1
+# 0.2.1
 
-## New Features:
+### New Features:
 
 No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 
 Removes extraneous `State` component info from the `Client.view_api()` method by [@abidlabs](https://github.com/freddyaboulton) in [PR 4107](https://github.com/gradio-app/gradio/pull/4107)
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 Separates flaky tests from non-flaky tests by [@abidlabs](https://github.com/freddyaboulton) in [PR 4107](https://github.com/gradio-app/gradio/pull/4107)
 
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 0.1.4
+# 0.1.4
 
-## New Features:
+### New Features:
 
 - Progress Updates from `gr.Progress()` can be accessed via `job.status().progress_data` by @freddyaboulton](https://github.com/freddyaboulton) in [PR 3924](https://github.com/gradio-app/gradio/pull/3924)
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixed bug where unnamed routes where displayed with `api_name` instead of `fn_index` in `view_api` by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3972](https://github.com/gradio-app/gradio/pull/3972)
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 0.1.3
+# 0.1.3
 
-## New Features:
+### New Features:
 
 No changes to highlight.
 
-## Bug Fixes:
+### Bug Fixes:
 
 - Fixed bug where `Video` components in latest gradio were not able to be deserialized by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 3860](https://github.com/gradio-app/gradio/pull/3860)
 
-## Documentation Changes:
+### Documentation Changes:
 
 No changes to highlight.
 
-## Testing and Infrastructure Changes:
+### Testing and Infrastructure Changes:
 
 No changes to highlight.
 
-## Breaking Changes:
+### Breaking Changes:
 
 No changes to highlight.
 
-## Full Changelog:
+### Full Changelog:
 
 No changes to highlight.
 
-## Contributors Shoutout:
+### Contributors Shoutout:
 
 No changes to highlight.
 
-# Version 0.1.2
+# 0.1.2
 
 First public release of the Gradio Client library! The `gradio_client` Python library that makes it very easy to use any Gradio app as an API. 
 
@@ -315,4 +297,4 @@ client.predict("audio_sample.wav")
 >> "This is a test of the whisper speech recognition model."
 ```
 
-Read more about how to use the `gradio_client` library here: https://gradio.app/getting-started-with-the-python-client/
+Read more about how to use the `gradio_client` library here: https://gradio.app/getting-started-with-the-python-client/
\ No newline at end of file
diff --git a/client/python/build_pypi.sh b/client/python/build_pypi.sh
new file mode 100755
index 0000000000..00068e11da
--- /dev/null
+++ b/client/python/build_pypi.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+set -e
+
+cd "$(dirname ${0})"
+
+python3 -m pip install build
+rm -rf dist/*
+rm -rf build/*
+python3 -m build
diff --git a/client/python/gradio_client/package.json b/client/python/gradio_client/package.json
new file mode 100644
index 0000000000..139542c201
--- /dev/null
+++ b/client/python/gradio_client/package.json
@@ -0,0 +1,7 @@
+{
+	"name": "gradio_client",
+	"version": "0.2.10",
+	"description": "",
+	"python": "true",
+	"main_changeset": true
+}
diff --git a/gradio/package.json b/gradio/package.json
new file mode 100644
index 0000000000..5d1178ede9
--- /dev/null
+++ b/gradio/package.json
@@ -0,0 +1,6 @@
+{
+	"name": "gradio",
+	"version": "3.38.0",
+	"description": "",
+	"python": "true"
+}
diff --git a/js/accordion/package.json b/js/accordion/package.json
index a38d2fe3c8..eea9b11cb1 100644
--- a/js/accordion/package.json
+++ b/js/accordion/package.json
@@ -6,5 +6,6 @@
 	"main": "src/index.ts",
 	"author": "",
 	"license": "ISC",
-	"private": true
+	"private": true,
+	"main_changeset": true
 }
diff --git a/js/app/package.json b/js/app/package.json
index f55bcaed37..343ce1cab8 100644
--- a/js/app/package.json
+++ b/js/app/package.json
@@ -59,5 +59,6 @@
 	},
 	"msw": {
 		"workerDirectory": "public"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/atoms/package.json b/js/atoms/package.json
index b807174fa2..fb5b0422e3 100644
--- a/js/atoms/package.json
+++ b/js/atoms/package.json
@@ -10,5 +10,6 @@
 	"dependencies": {
 		"@gradio/utils": "workspace:^0.0.1",
 		"@gradio/icons": "workspace:^0.0.1"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/audio/package.json b/js/audio/package.json
index 41d44d75c3..4475258954 100644
--- a/js/audio/package.json
+++ b/js/audio/package.json
@@ -16,5 +16,6 @@
 		"extendable-media-recorder": "^7.0.2",
 		"extendable-media-recorder-wav-encoder": "^7.0.76",
 		"svelte-range-slider-pips": "^2.0.1"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/button/README.md b/js/button/README.md
index e5b427fdb3..f8181d20c1 100644
--- a/js/button/README.md
+++ b/js/button/README.md
@@ -1,4 +1,4 @@
-# `@gradio/button`
+# `@gradio/boop`
 
 ```html
 <script>
diff --git a/js/button/package.json b/js/button/package.json
index 5182221f17..d745e4b46c 100644
--- a/js/button/package.json
+++ b/js/button/package.json
@@ -9,5 +9,6 @@
 	"private": true,
 	"dependencies": {
 		"@gradio/utils": "workspace:^0.0.1"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/chart/package.json b/js/chart/package.json
index 43afe7d202..12ea335565 100644
--- a/js/chart/package.json
+++ b/js/chart/package.json
@@ -20,5 +20,6 @@
 		"@types/d3-dsv": "^3.0.0",
 		"@types/d3-scale": "^4.0.2",
 		"@types/d3-shape": "^3.0.2"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/chatbot/package.json b/js/chatbot/package.json
index b3f1003727..349fe014fd 100644
--- a/js/chatbot/package.json
+++ b/js/chatbot/package.json
@@ -22,5 +22,6 @@
 		"prismjs": "1.29.0",
 		"dompurify": "^3.0.3",
 		"@types/dompurify": "^3.0.2"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/code/package.json b/js/code/package.json
index a406df2f64..f51c768d99 100644
--- a/js/code/package.json
+++ b/js/code/package.json
@@ -31,5 +31,6 @@
 		"cm6-theme-basic-dark": "^0.2.0",
 		"cm6-theme-basic-light": "^0.2.0",
 		"codemirror": "^6.0.1"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/file/package.json b/js/file/package.json
index 8246c24409..68730ff18c 100644
--- a/js/file/package.json
+++ b/js/file/package.json
@@ -12,5 +12,6 @@
 		"@gradio/icons": "workspace:^0.0.1",
 		"@gradio/upload": "workspace:^0.0.1",
 		"@gradio/utils": "workspace:^0.0.1"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/form/package.json b/js/form/package.json
index 1df7dc4bfd..64e313a675 100644
--- a/js/form/package.json
+++ b/js/form/package.json
@@ -11,5 +11,6 @@
 		"@gradio/atoms": "workspace:^0.0.1",
 		"@gradio/utils": "workspace:^0.0.1",
 		"@gradio/icons": "workspace:^0.0.1"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/gallery/package.json b/js/gallery/package.json
index 3c700b405e..bb5dde77de 100644
--- a/js/gallery/package.json
+++ b/js/gallery/package.json
@@ -13,5 +13,6 @@
 		"@gradio/image": "workspace:^0.0.1",
 		"@gradio/upload": "workspace:^0.0.1",
 		"@gradio/utils": "workspace:^0.0.1"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/highlighted-text/package.json b/js/highlighted-text/package.json
index aef03128a2..5d96325069 100644
--- a/js/highlighted-text/package.json
+++ b/js/highlighted-text/package.json
@@ -10,5 +10,6 @@
 	"dependencies": {
 		"@gradio/theme": "workspace:^0.0.1",
 		"@gradio/utils": "workspace:^0.0.1"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/html/package.json b/js/html/package.json
index 1b921b3f08..cac686cbfc 100644
--- a/js/html/package.json
+++ b/js/html/package.json
@@ -6,5 +6,6 @@
 	"main": "src/index.ts",
 	"author": "",
 	"license": "ISC",
-	"private": true
+	"private": true,
+	"main_changeset": true
 }
diff --git a/js/icons/package.json b/js/icons/package.json
index 63cf8a81ef..671175e91f 100644
--- a/js/icons/package.json
+++ b/js/icons/package.json
@@ -6,5 +6,6 @@
 	"main": "src/index.ts",
 	"author": "",
 	"license": "ISC",
-	"private": true
+	"private": true,
+	"main_changeset": true
 }
diff --git a/js/image/package.json b/js/image/package.json
index 54b6947a21..6a8ab28fdb 100644
--- a/js/image/package.json
+++ b/js/image/package.json
@@ -15,5 +15,6 @@
 		"cropperjs": "^1.5.12",
 		"lazy-brush": "^1.0.1",
 		"resize-observer-polyfill": "^1.5.1"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/json/package.json b/js/json/package.json
index a56bd97953..93cdda6131 100644
--- a/js/json/package.json
+++ b/js/json/package.json
@@ -10,5 +10,6 @@
 	"dependencies": {
 		"@gradio/atoms": "workspace:^0.0.1",
 		"@gradio/icons": "workspace:^0.0.1"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/label/package.json b/js/label/package.json
index 6b20c9c9e8..5b04aab4e8 100644
--- a/js/label/package.json
+++ b/js/label/package.json
@@ -9,5 +9,6 @@
 	"private": true,
 	"dependencies": {
 		"@gradio/utils": "workspace:^0.0.1"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/markdown/package.json b/js/markdown/package.json
index daf0fc26eb..6540fdf5c5 100644
--- a/js/markdown/package.json
+++ b/js/markdown/package.json
@@ -6,5 +6,6 @@
 	"main": "src/index.ts",
 	"author": "",
 	"license": "ISC",
-	"private": true
+	"private": true,
+	"main_changeset": true
 }
diff --git a/js/model3D/package.json b/js/model3D/package.json
index fb1bafa33e..866c3e3a6a 100644
--- a/js/model3D/package.json
+++ b/js/model3D/package.json
@@ -13,5 +13,6 @@
 		"@gradio/upload": "workspace:^0.0.1",
 		"babylonjs": "^4.2.1",
 		"babylonjs-loaders": "^4.2.1"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/plot/package.json b/js/plot/package.json
index aa764f3522..a166a6152c 100644
--- a/js/plot/package.json
+++ b/js/plot/package.json
@@ -17,5 +17,6 @@
 		"svelte-vega": "^2.0.0",
 		"vega": "^5.22.1",
 		"vega-lite": "^5.12.0"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/table/README.md b/js/table/README.md
index b1508da249..69d6317d34 100644
--- a/js/table/README.md
+++ b/js/table/README.md
@@ -1 +1 @@
-# `@gradio/table`
+# `@gradio/table`
\ No newline at end of file
diff --git a/js/table/package.json b/js/table/package.json
index 23ad55330a..adf161f61c 100644
--- a/js/table/package.json
+++ b/js/table/package.json
@@ -14,5 +14,6 @@
 		"@types/d3-dsv": "^3.0.0",
 		"d3-dsv": "^3.0.1",
 		"dequal": "^2.0.2"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/tabs/package.json b/js/tabs/package.json
index 3bf6beadaa..2e0a6fef1f 100644
--- a/js/tabs/package.json
+++ b/js/tabs/package.json
@@ -9,5 +9,6 @@
 	"private": true,
 	"dependencies": {
 		"@gradio/utils": "workspace:^0.0.1"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/theme/package.json b/js/theme/package.json
index 17035f5db9..2bff12ed17 100644
--- a/js/theme/package.json
+++ b/js/theme/package.json
@@ -9,5 +9,6 @@
 	"private": true,
 	"scripts": {
 		"generate": "pollen -c src/pollen.config.cjs"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/tooltip/package.json b/js/tooltip/package.json
index d184d6f4a8..e42dac5c96 100644
--- a/js/tooltip/package.json
+++ b/js/tooltip/package.json
@@ -6,5 +6,6 @@
 	"main": "src/index.ts",
 	"author": "",
 	"license": "ISC",
-	"private": true
+	"private": true,
+	"main_changeset": true
 }
diff --git a/js/upload-button/package.json b/js/upload-button/package.json
index 57d56835af..9449250b80 100644
--- a/js/upload-button/package.json
+++ b/js/upload-button/package.json
@@ -11,5 +11,6 @@
 		"@gradio/button": "workspace:^0.0.1",
 		"@gradio/utils": "workspace:^0.0.1",
 		"@gradio/upload": "workspace:^0.0.1"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/upload/package.json b/js/upload/package.json
index f4b03072a2..4cadecfee0 100644
--- a/js/upload/package.json
+++ b/js/upload/package.json
@@ -10,5 +10,6 @@
 	"dependencies": {
 		"@gradio/atoms": "workspace:^0.0.1",
 		"@gradio/icons": "workspace:^0.0.1"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/utils/package.json b/js/utils/package.json
index 545d5dc919..6b8d748808 100644
--- a/js/utils/package.json
+++ b/js/utils/package.json
@@ -9,5 +9,6 @@
 	"private": true,
 	"dependencies": {
 		"@gradio/theme": "workspace:^0.0.1"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/js/video/package.json b/js/video/package.json
index 30410bdb10..e60841c593 100644
--- a/js/video/package.json
+++ b/js/video/package.json
@@ -13,5 +13,6 @@
 		"@gradio/icons": "workspace:^0.0.1",
 		"@gradio/image": "workspace:^0.0.1",
 		"@gradio/upload": "workspace:^0.0.1"
-	}
+	},
+	"main_changeset": true
 }
diff --git a/package.json b/package.json
index bbe2e73263..e77e107d14 100644
--- a/package.json
+++ b/package.json
@@ -23,10 +23,10 @@
 		"test:browser:full": "run-s build test:browser",
 		"test:browser:verbose": "pnpm test:browser",
 		"test:browser:dev": "pnpm --filter @gradio/app test:browser:dev",
-		"ci:publish": "pnpm publish --no-git-checks --access public -r",
-		"ci:version": "changeset version && pnpm i --lockfile-only",
 		"storybook": "storybook dev -p 6006 --config-dir js/storybook",
 		"build-storybook": "storybook build --config-dir js/storybook",
+		"ci:version": "changeset version && pnpm i --lockfile-only && node ./.changeset/fix_changelogs.cjs",
+		"ci:publish": "pnpm publish --no-git-checks --access public -r --filter=@gradio/*",
 		"chromatic": "chromatic",
 		"test:ct": "playwright test -c ./.config/playwright-ct.config.ts"
 	},
@@ -37,8 +37,10 @@
 	"dependencies": {
 		"@changesets/changelog-github": "^0.4.8",
 		"@changesets/cli": "^2.26.1",
+		"@changesets/get-github-info": "^0.5.2",
 		"@csstools/postcss-global-data": "^2.0.0",
 		"@gradio/tootils": "workspace:^0.0.1",
+		"@manypkg/get-packages": "^2.2.0",
 		"@playwright/experimental-ct-svelte": "^1.35.1",
 		"@playwright/test": "^1.35.1",
 		"@sveltejs/vite-plugin-svelte": "^2.4.2",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 5314ca85fd..b99c7a1bd5 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,4 +1,4 @@
-lockfileVersion: '6.1'
+lockfileVersion: '6.0'
 
 settings:
   autoInstallPeers: true
@@ -14,12 +14,18 @@ importers:
       '@changesets/cli':
         specifier: ^2.26.1
         version: 2.26.1
+      '@changesets/get-github-info':
+        specifier: ^0.5.2
+        version: 0.5.2
       '@csstools/postcss-global-data':
         specifier: ^2.0.0
         version: 2.0.0(postcss@8.4.6)
       '@gradio/tootils':
         specifier: workspace:^0.0.1
         version: link:js/tootils
+      '@manypkg/get-packages':
+        specifier: ^2.2.0
+        version: 2.2.0
       '@playwright/experimental-ct-svelte':
         specifier: ^1.35.1
         version: 1.35.1(@types/node@20.3.1)(less@4.1.3)(svelte@4.0.0)(vite@4.3.9)
@@ -218,6 +224,10 @@ importers:
         specifier: ^0.18.0
         version: 0.18.0
 
+  client/python/gradio_client: {}
+
+  gradio: {}
+
   js/_cdn-test:
     devDependencies:
       vite:
@@ -4281,6 +4291,15 @@ packages:
       fs-extra: 8.1.0
     dev: false
 
+  /@manypkg/find-root@2.2.1:
+    resolution: {integrity: sha512-34NlypD5mmTY65cFAK7QPgY5Tzt0qXR4ZRXdg97xAlkiLuwXUPBEXy5Hsqzd+7S2acsLxUz6Cs50rlDZQr4xUA==}
+    engines: {node: '>=14.18.0'}
+    dependencies:
+      '@manypkg/tools': 1.1.0
+      find-up: 4.1.0
+      fs-extra: 8.1.0
+    dev: false
+
   /@manypkg/get-packages@1.1.3:
     resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==}
     dependencies:
@@ -4292,6 +4311,24 @@ packages:
       read-yaml-file: 1.1.0
     dev: false
 
+  /@manypkg/get-packages@2.2.0:
+    resolution: {integrity: sha512-B5p5BXMwhGZKi/syEEAP1eVg5DZ/9LP+MZr0HqfrHLgu9fq0w4ZwH8yVen4JmjrxI2dWS31dcoswYzuphLaRxg==}
+    engines: {node: '>=14.18.0'}
+    dependencies:
+      '@manypkg/find-root': 2.2.1
+      '@manypkg/tools': 1.1.0
+    dev: false
+
+  /@manypkg/tools@1.1.0:
+    resolution: {integrity: sha512-SkAyKAByB9l93Slyg8AUHGuM2kjvWioUTCckT/03J09jYnfEzMO/wSXmEhnKGYs6qx9De8TH4yJCl0Y9lRgnyQ==}
+    engines: {node: '>=14.18.0'}
+    dependencies:
+      fs-extra: 8.1.0
+      globby: 11.1.0
+      jju: 1.4.0
+      read-yaml-file: 1.1.0
+    dev: false
+
   /@mdx-js/react@2.3.0(react@18.2.0):
     resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==}
     peerDependencies:
@@ -10120,6 +10157,10 @@ packages:
     hasBin: true
     dev: true
 
+  /jju@1.4.0:
+    resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
+    dev: false
+
   /js-levenshtein@1.1.6:
     resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==}
     engines: {node: '>=0.10.0'}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 3a1712660f..930546311b 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,3 +1,5 @@
 packages:
   - 'js/*'
-  - 'client/js'
+  - "gradio"
+  - "client/*"
+  - "client/*/*"
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
index a80f86c1c2..7de4b14e36 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -47,6 +47,7 @@
 		"**/*.js",
 		"**/*.ts",
 		"**/*.svelte",
-		"client/js/**/*"
+		"client/js/**/*",
+		".changeset/*.cjs"
 	]
 }


Code review comments:
diff_hunk: @@ -0,0 +1,38 @@
+name: Generate changeset
+on:
+  workflow_run:
+    workflows: ["trigger changeset generation"]
+    types:
+      - completed
+
+env:
+  CI: true
+  NODE_OPTIONS: "--max-old-space-size=4096"
+
+concurrency:
+  group: ${{ github.event.workflow_run.head_repository.full_name }}::${{ github.event.workflow_run.head_branch }}
+
+jobs:
+  version:
+    permissions: write-all
+    name: static checks
+    runs-on: ubuntu-22.04
+    if: (github.event.workflow_run.head_repository.full_name == 'gradio-app/gradio' && github.event.workflow_run.head_branch != 'main') || github.event.workflow_run.head_repository.full_name != 'gradio-app/gradio'
+    steps:
+      - id: 'get-pr'
+        uses: "gradio-app/github/actions/get-pr-branch@main"
+        with:
+          github_token: ${{ secrets.GITHUB_TOKEN }}
+      - name: get pr number
+        run: echo "PR number is ${{ steps.get-pr.outputs.pr_number }}"
+      - uses: actions/checkout@v3
+        with:
+          repository: ${{ github.event.workflow_run.head_repository.full_name }}
+          ref: ${{ github.event.workflow_run.head_branch }}
+          fetch-depth: 0
+      - name: generate changeset
+        uses: "gradio-app/github/actions/generate-changeset@main"
+        with: 
+          github_token: ${{ secrets.PAT }}
path: .github/workflows/generate-changeset.yml
text: @author:
```suggestion
          github_token: ${{ secrets.COMMENT_TOKEN }}
```

diff_hunk: @@ -1,4 +1,4 @@
-# `@gradio/button`
+# `@gradio/boop`
path: js/button/README.md
text: @user1:
i think we need to remove my boop here 😁 

@author:
ah, yes.

diff_hunk: @@ -1,4 +1,4 @@
-# `@gradio/button`
+# `@gradio/boop`
path: js/button/README.md
text: @author:
```suggestion
# `@user1/button`
```

diff_hunk: @@ -0,0 +1,38 @@
+name: Generate changeset
+on:
+  workflow_run:
+    workflows: ["trigger changeset generation"]
+    types:
+      - completed
+
+env:
+  CI: true
+  NODE_OPTIONS: "--max-old-space-size=4096"
+
+concurrency:
+  group: ${{ github.event.workflow_run.head_repository.full_name }}::${{ github.event.workflow_run.head_branch }}
+
+jobs:
+  version:
+    permissions: write-all
+    name: static checks
+    runs-on: ubuntu-22.04
+    if: (github.event.workflow_run.head_repository.full_name == 'gradio-app/gradio' && github.event.workflow_run.head_branch != 'main') || github.event.workflow_run.head_repository.full_name != 'gradio-app/gradio'
+    steps:
+      - id: 'get-pr'
+        uses: "gradio-app/github/actions/get-pr-branch@main"
+        with:
+          github_token: ${{ secrets.GITHUB_TOKEN }}
+      - name: get pr number
+        run: echo "PR number is ${{ steps.get-pr.outputs.pr_number }}"
+      - uses: actions/checkout@v3
+        with:
+          repository: ${{ github.event.workflow_run.head_repository.full_name }}
+          ref: ${{ github.event.workflow_run.head_branch }}
+          fetch-depth: 0
+      - name: generate changeset
+        uses: "gradio-app/github/actions/generate-changeset@main"
+        with: 
+          github_token: ${{ secrets.PAT }}
path: .github/workflows/generate-changeset.yml
text: @user2:
I just checked and @user1-pr-bot is in the org so I think we can use `secrets.COMMENT_TOKEN` here.