Reset progress bar in between report runs
diff --git a/frontend/src/components/core/Block/Block.tsx b/frontend/src/components/core/Block/Block.tsx
index a403c3d1674f..c6df749bb5fe 100644
--- a/frontend/src/components/core/Block/Block.tsx
+++ b/frontend/src/components/core/Block/Block.tsx
@@ -16,7 +16,6 @@
  */
 
 import React, { PureComponent, ReactNode, Suspense } from "react"
-import { Progress } from "reactstrap"
 import { AutoSizer } from "react-virtualized"
 import { List, Map as ImmutableMap } from "immutable"
 import { dispatchOneOf } from "lib/immutableProto"
@@ -59,6 +58,7 @@ const Button = React.lazy(() => import("components/widgets/Button/"))
 const Checkbox = React.lazy(() => import("components/widgets/Checkbox/"))
 const DateInput = React.lazy(() => import("components/widgets/DateInput/"))
 const Multiselect = React.lazy(() => import("components/widgets/Multiselect/"))
+const Progress = React.lazy(() => import("components/elements/Progress/"))
 const Radio = React.lazy(() => import("components/widgets/Radio/"))
 const Selectbox = React.lazy(() => import("components/widgets/Selectbox/"))
 const Slider = React.lazy(() => import("components/widgets/Slider/"))
@@ -249,13 +249,7 @@ class Block extends PureComponent<Props> {
       plotlyChart: (el: SimpleElement) => (
         <PlotlyChart element={el} width={width} />
       ),
-      progress: (el: SimpleElement) => (
-        <Progress
-          value={el.get("value")}
-          className="stProgress"
-          style={{ width }}
-        />
-      ),
+      progress: (el: SimpleElement) => <Progress element={el} width={width} />,
       table: (el: SimpleElement) => <Table element={el} width={width} />,
       text: (el: SimpleElement) => <Text element={el} width={width} />,
       vegaLiteChart: (el: SimpleElement) => (
diff --git a/frontend/src/components/elements/Progress/Progress.scss b/frontend/src/components/elements/Progress/Progress.scss
new file mode 100644
index 000000000000..584db1e590f8
--- /dev/null
+++ b/frontend/src/components/elements/Progress/Progress.scss
@@ -0,0 +1,32 @@
+/**
+ * Copyright 2018-2019 Streamlit Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@import "src/assets/css/variables";
+
+// Reset the progress bar to 0 without animating on report re-run.
+.reportview-container {
+  .without-transition .progress-bar {
+    transition: none;
+  }
+
+  .with-transition .progress-bar {
+    transition: width 0.1s linear;
+  }
+
+  .stale-element .progress-bar {
+    background-color: transparent;
+  }
+}
diff --git a/frontend/src/components/elements/Progress/Progress.tsx b/frontend/src/components/elements/Progress/Progress.tsx
new file mode 100644
index 000000000000..3142ac25a34b
--- /dev/null
+++ b/frontend/src/components/elements/Progress/Progress.tsx
@@ -0,0 +1,63 @@
+/**
+ * @license
+ * Copyright 2018-2019 Streamlit Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from "react"
+import { Map as ImmutableMap } from "immutable"
+import { Progress as UIProgress } from "reactstrap"
+
+import "./Progress.scss"
+
+interface Props {
+  width: number
+  element: ImmutableMap<string, any>
+}
+
+const FAST_UPDATE_MS = 50
+
+class Progress extends React.PureComponent<Props> {
+  lastValue = -1
+  lastAnimatedTime = -1
+
+  public render(): React.ReactNode {
+    const { element, width } = this.props
+    const value = element.get("value")
+    const time = new Date().getTime()
+
+    // Make progress bar stop acting weird when moving backwards or quickly.
+    const isMovingBackwards = value < this.lastValue
+    const isMovingSuperFast = time - this.lastAnimatedTime < FAST_UPDATE_MS
+    const className =
+      isMovingBackwards || isMovingSuperFast
+        ? "without-transition"
+        : "with-transition"
+
+    if (className === "with-transition") {
+      this.lastAnimatedTime = time
+    }
+    this.lastValue = value
+
+    return (
+      <UIProgress
+        value={value}
+        className={"stProgress " + className}
+        style={{ width }}
+      />
+    )
+  }
+}
+
+export default Progress
diff --git a/frontend/src/components/elements/Progress/index.tsx b/frontend/src/components/elements/Progress/index.tsx
new file mode 100644
index 000000000000..9bf69066a927
--- /dev/null
+++ b/frontend/src/components/elements/Progress/index.tsx
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright 2018-2019 Streamlit Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { default } from "./Progress"
diff --git a/lib/streamlit/credentials.py b/lib/streamlit/credentials.py
index 7202ba6cf8b2..b32909eca171 100644
--- a/lib/streamlit/credentials.py
+++ b/lib/streamlit/credentials.py
@@ -202,8 +202,10 @@ def activate(self, show_instructions=True):
                     email = ""
                 else:
                     email = click.prompt(
-                        text=EMAIL_PROMPT, prompt_suffix="", default="",
-                        show_default=False
+                        text=EMAIL_PROMPT,
+                        prompt_suffix="",
+                        default="",
+                        show_default=False,
                     )
 
                 self.activation = _verify_email(email)
diff --git a/lib/streamlit/server/Server.py b/lib/streamlit/server/Server.py
index 5280bb3d386d..723de9c72ea8 100644
--- a/lib/streamlit/server/Server.py
+++ b/lib/streamlit/server/Server.py
@@ -247,10 +247,11 @@ def _create_app(self):
 
             routes.extend(
                 [
-                    (r"/(.*)", StaticFileHandler, {
-                        "path": "%s/" % static_path,
-                        "default_filename": "index.html",
-                    }),
+                    (
+                        r"/(.*)",
+                        StaticFileHandler,
+                        {"path": "%s/" % static_path, "default_filename": "index.html"},
+                    )
                 ]
             )
 
diff --git a/lib/streamlit/util.py b/lib/streamlit/util.py
index bb553c899e60..d9eafdb92cb8 100644
--- a/lib/streamlit/util.py
+++ b/lib/streamlit/util.py
@@ -252,6 +252,7 @@ def open_browser(url):
         #    browser even though 'start url' works from the command prompt.
         # Fun!
         import webbrowser
+
         webbrowser.open(url)
         return
 

**Issue:** 

https://github.com/streamlit/streamlit-old-private/issues/760

**Description:**

- Unmount progress bar when it's stale so it resets

**Notes:**
- I didn't see any issues with the `update-progress animation` as mentioned in the issue. Perhaps @tconkling can provide reproduction steps for that.