diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000000..1f6b50a084
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,311 @@
+# Changes merged into master
+
+
+
+## [#103](https://github.com/jaegertracing/jaeger-ui/pull/103) Add a changelog, dates to 2017-08-23
+
+Non-functional change.
+
+Adds a `CHANGELOG.md` document that details merged PRs.
+
+Starts from late August, 2017.
+
+
+## [#93](https://github.com/jaegertracing/jaeger-ui/pull/93) Keyboard shortcuts and minimap UX (2017-10-20)
+
+![93-00-viewrange-ux-kbd](https://user-images.githubusercontent.com/2304337/31641055-2c00529e-b2b0-11e7-9ff2-34716ecfcc70.gif)
+
+**Issues addressed:**
+
+- [In-trace search should allow navigation between results](https://github.com/uber/jaeger-ui/issues/91) (partially addresses)
+- Fix #89 - [trace view - Drag and release on timeline header row zooms into respective range](https://github.com/uber/jaeger-ui/issues/89)
+- Fix #23 - [trace view - Navigate and zoom via minimap](https://github.com/uber/jaeger-ui/issues/23)
+- Fix #22 - [trace view - Pan and zoom via keyboard shortcuts](https://github.com/uber/jaeger-ui/issues/22)
+
+**Changes:**
+
+- Revamped mouse UX on trace minimap
+- Adjusted rendering of the trace minimap to make spans more visible in large traces
+- Added visuals and mouse UX for zooming to trace timeline header row
+- Added keyboard shortcuts:
+ - Scroll up, down (`w`, `s`)
+ - Scroll to next, previous visible span (`f`, `b`)
+ - Pan left, right (`a` or `left`, `d` or `right`)
+ - Large pan left, right (`shift+left`, `shift+right`)
+ - Zoom in, out (`up`, `down`)
+ - Large zoom in, out (`shift+up`, `shift+down`)
+
+
+
+## [#84](https://github.com/jaegertracing/jaeger-ui/pull/84) Improve search dropdowns (2017-09-28)
+
+- Fix #79 - Sort services and operations operations (case insensitive)
+- Fix #31 - Filter options based on contains instead of starts with
+- Fix #30 - Filter options based on case insensitive match
+
+
+
+## [#78](https://github.com/jaegertracing/jaeger-ui/pull/78) Custom menu via /api/config with project links as defaults (2017-09-26)
+
+Fix #44.
+
+- Configurable top-level links
+- Attempts to download `/api/config`, errors cause fall-back to default
+- Supports one level of nesting
+- Supports a `label` and `url` for each link
+- Groups support a `label` and `items` where `items` is an array of links
+- **All links open to external tabs**
+- **Does not currently support a "selected" state for links**
+
+Default menu config:
+
+- About Jaeger
+ - [GitHub](https://github.com/uber/jaeger)
+ - [Docs](http://jaeger.readthedocs.io/en/latest/)
+ - [Twitter](https://twitter.com/JaegerTracing)
+ - [Discussion Group](https://groups.google.com/forum/#!forum/jaeger-tracing)
+ - [Gitter.im](https://gitter.im/jaegertracing/Lobby)
+ - [Blog](https://medium.com/jaegertracing/)
+- ~Create a ticket~
+
+**Screenshot updated**
+![screen shot 2017-09-21 at 2 37 09 pm](https://user-images.githubusercontent.com/2304337/30712608-94d114e6-9eda-11e7-952a-b44a09a7e967.png)
+
+
+
+## [#81](https://github.com/jaegertracing/jaeger-ui/pull/81) Fix Google Analytics tracking (2017-09-26)
+
+Fix #80.
+
+Created an HOC that checks the state of the router and tracks a page-view whenever the URL or query string changes. This is necessary because react-router v4 [did away with the onUpdate](https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/guides/migrating.md#on-properties) lifecycle event.
+
+
+
+## [#83](https://github.com/jaegertracing/jaeger-ui/pull/83) Fix traceIDs query params clobbering form search (2017-09-26)
+
+Fix #82.
+
+Changed functionality is: traceIDs are ignored when the search form is triggering the search.
+
+
+
+## [#77](https://github.com/jaegertracing/jaeger-ui/pull/77) Fix trace mini-map blurry when < 60 spans (2017-09-21)
+
+Fix #76.
+
+Before:
+
+After:
+
+
+
+## [#74](https://github.com/jaegertracing/jaeger-ui/pull/74) Make left column adjustable in trace detail (2017-09-20)
+
+Fix #63 .
+
+Column width of span name is now adjustable, within the bounds of [15%, 85%]. It's not clear in the gif, below, but the reduced opacity highlight color is present when dragging the column in either direction.
+
+![64-01-resize-left-column](https://user-images.githubusercontent.com/2304337/30423428-9b2808e2-98f7-11e7-9fb0-559d6dbc4268.gif)
+
+
+
+## [#72](https://github.com/jaegertracing/jaeger-ui/pull/72) Use canvas instead of SVG for trace mini-map (2017-09-17)
+
+Fix #61.
+
+- Render span graph via canvas instead of SVG
+- Zoom range changed to [0, 1], e.g. time and trace agnostic (allowed removal of some utils)
+- "Timeline" -> 0ms
+- Use props instead of context to provide span graph with viewing range
+- Move all span graph related classes into same folder
+- Misc CSS cleanup
+
+
+
+## [#71](https://github.com/jaegertracing/jaeger-ui/pull/71) [trave view] Mouseover expands truncated text to full length in left column (2017-09-14)
+
+Fix #65.
+
+See attached screenshot (text is blurry due to scaling down retina dpi).
+
+Mouseover in the span name column expands the service/operation text if it is truncated.
+
+Also, fixed regression in header for left column ("Span Name" -> "Service & Operation").
+
+![span-name-hover-marked](https://user-images.githubusercontent.com/2304337/30237887-ac93a510-9509-11e7-9842-ecf96e928da0.png)
+
+
+
+
+## [#68](https://github.com/jaegertracing/jaeger-ui/pull/68) Virtualized scrolling for trace detail view (2017-09-08)
+
+### Description
+
+Started with [react-virtualized](https://github.com/bvaughn/react-virtualized), but issues around flashes of un-rendered regions while scrolling and dynamically sized / periodically changing content lead to revival of old project that essentially does the same thing: `src/components/TracePage/TraceTimelineViewer/ListView/*`.
+
+`ListView` is more optimized to our needs (and less versatile). These optimizations include:
+
+- Taking the approach of rendering less often and larger amounts of items per render
+- Optimizing for scrolling in both directions instead of only the current scroll direction
+- Having a concept of minimum and regular ["overscan"](https://github.com/bvaughn/react-virtualized/blob/master/docs/overscanUsage.md), which means if the currently rendered list of items meets a minimum buffer, don't render more, but if it doesn't, then render enough meet the minimum buffer and some extra, as well
+
+### Performance
+
+#### Flashes of un-rendered content
+
+- Smaller traces (~500 spans or less)
+ - Not really an issue in prod or PR 68
+- Larger traces (~5k spans)
+ - PR 68 is on par with prod, possible slightly better
+ - Still fairly easy to see flashes of un-rendered content
+ - Issue was quite aggravated with react-virtualized (hence, a custom solution is implemented)
+- Massive traces (~15k spans or more)
+ - Flashes of un-rendered content is a significant problem for the release currently in prod
+ - PR 68 performance doesn't vary much between 5k and 15k+ traces
+
+
+#### Performance on a 5,000 span trace
+
+_Sample size of 1._
+
+- /trace/8d224b61611c807f
+- Duration: 5.83s
+- Services: 11
+- Depth: 11
+- Spans: 5,013
+- Performance recording enabled (degrades performance)
+
+**Initial loading (in milliseconds)**
+
+Task | Prod - PR 53 (ms) | PR 68 (ms) | Ratio | Reduction
+-- | -- | -- | -- | --
+**Total** | **6,964** | **1,899** | **0.27** | **73%**
+Loading | 45 | 32 ||
+**Scripting** | **3,051** | **1,198** | **0.39** | **61%**
+**Rendering** | **3,126** | **430** | **0.14** | **86%**
+Painting | 116 | 34 ||
+Other | 626 | 205 ||
+
+Note: Ticket #61 (Use canvas instead of SVG for trace mini-map) will likely further improve initial loading.
+
+**Expanding details**
+
+- Prod : 3753 ms
+- PR 68: 418 ms (0.11)
+
+**Text search ("gopro")**
+
+- Prod : 5496 ms
+- PR 68: 227 ms (0.04)
+
+#### Performance on a 42,000 span trace
+
+_Sample size of 1._
+
+- /trace/c440ed36
+- Duration: 3,393.93s
+- Services: 25
+- Depth: 11
+- Total Spans: 42,499
+- Performance recording enabled (degrades performance)
+
+**Initial loading (in milliseconds)**
+
+Task | Prod - PR 53 (ms) | PR 68 (ms) | Ratio | Reduction
+-- | -- | -- | -- | --
+**Total** | **86,792** | **7,105** | **0.08** | **92%**
+**Scripting** | **28,273** | **5,596** | **0.20** | **80%**
+**Rendering** | **57,197** | **1,424** | **0.03** | **97%**
+Painting | 1,321 | 85 | 0.06 | 96%
+
+
+**Expanding details**
+
+- Prod : 39,500 ms
+- PR 68: 465 ms (0.01)
+
+**Text search**
+
+- Prod : 43,728 ms
+- PR 68: 757 ms (0.02)
+
+
+
+## [#64](https://github.com/jaegertracing/jaeger-ui/pull/64) Reorganize span detail components (2017-08-25)
+
+- Split sub-components of `SpanDetail` out into separate files.
+- Move styles into CSS (addresses [this PR comment](https://github.com/uber/jaeger-ui/pull/53#discussion_r134318660))
+- Misc style and DOM tweaks (see attached screenshot)
+ - Expanded table styling
+ - Tag summary styling
+ - Background on hover of expandable / collapsable elements
+ - Debug info
+
+![span-detail-pr-marked](https://user-images.githubusercontent.com/2304337/29575771-870667b2-8733-11e7-8af5-1d804cf273a2.png)
+
+
+
+## [#67](https://github.com/jaegertracing/jaeger-ui/pull/67) Change to use node >= 6 via .nvmrc (2017-08-24)
+
+Upgrade to latest ([#53](https://github.com/jaegertracing/jaeger-ui/pull/53)) requires node >= 6.
+
+
+
+## [#53](https://github.com/jaegertracing/jaeger-ui/pull/53) Refactor trace detail (2017-08-23)
+
+#### SpanGraph
+
+- Fix #49 - Span position in graph doesn't not match its position in the detail
+- Ticks in span graph made to match trace detail (in number and formatting)
+- Span graph refactored to trim down files and DOM elements
+- Styling adjustments
+
+#### TracePageHeader
+
+- `trace` prop removed
+- Added props for various title values instead of deriving them from `trace`
+
+#### Trace Detail
+
+- Several components split out into separate files
+- `transformTrace` to use already created span tree to determine span depth
+- Fix #59 - "Span Name" to "Service & Operation"
+
+#### Span Bar / Detail
+
+- Fix uber/jaeger#326: extraneous scrollbars in trace views
+- Fix #55: Some tags were not being rendered due to clashing keys (observed in a log message)
+- Tall content scrolls via entire table instead of single table cell
+- Horizontal scrolling for wide content (e.g. long log values) (Fix #58)
+- Full width of the header is clickable for tags, process, and logs headers (instead of header text, only)
+- Service and endpoint are shown on mouseover anywhere in span bar row
+- Label on span bars no longer off-screen
+- Clip or hide span bars when zoomed in (instead of flush left)
+- Add shadow to left / right boundary when span bar view is clipped
+- Darkened span name column to differentiate from span bar section
+- Span detail left column color coded by service
+- Clicking span detail left column collapses detail
+- Clicking anywhere left of parent span name toggles children visibility
+- Prevent collision of logs in log entries table
+
+#### SearchTracePage
+- Scatterplot dots are sized based on number of spans
+- Scatterplot dots mouseover shows trace name
+
+#### Misc
+- Several TraceTimelineViewer / utils removed
+- `TreeNode` `.walk()` method can now be used to calculate the depth, avoiding use of less efficient `.getPath()`
+- Removed several `console.error` warnings caused by React key issues
+- `yarn upgrade --latest`
+- Removed `react-sticky`
+- Fix #42 - Support URL prefix via homepage in package.json
+- Maintenance of tests
+- Cleanup unused vars, imports
+- Refine utils
+- Many styles moved to CSS
+
+
+
+## Before 2017-08-23
+
+[Older changes are not logged here.](https://www.youtube.com/watch?v=NoAzpa1x7jU&feature=youtu.be&t=107)