This website uses cookies

We use cookies to personalize content and ads, to provide social media features and to analyze our traffic. You consent to our cookies if you continue to use our website. 

These cookies are necessary for the Website to function and cannot be turned off in our systems. They are usually only set in response to actions made by you which amount to a request for information or services, such as logging in or filling in forms on our Website. You can set your browser to block or alert you about these cookies, but some parts of the Website will not then work. These cookies do not store any personally identifiable information.
NameProviderPurposeExpiryType
BIGipServer# [x2]194-vvc-221.mktoresp.com
app-ab13.marketo.com
Used to distribute traffic to the website on several servers in order to optimise response times.SessionHTTP
CookieConsentabout.gitlab.comStores the user's cookie consent state for the current domain1 yearHTTP
__cfduid [x3]codepen.io
medium.com
puu.sh
Used by the content network, Cloudflare, to identify trusted web traffic.1 yearHTTP
JSESSIONIDnr-data.netPreserves users states across page requests.SessionHTTP
f5_cspmpubmatic.comSaves the address and port number of the web server that is managing the session. Used to improve the website's performance security.SessionHTTP
These cookies enable us to provide enhanced functionality and personalization for our website. They may be set by us or by third party providers whose services we have added to our pages. If you do not allow these cookies then some or all of these services may not function properly
NameProviderPurposeExpiryType
DFTT_END_USER_PREV_BOOTSTRAPPEDabout.gitlab.comBoolean indicating the user has previously been authenticated.2 yearsHTTP
lang [x2]ads.linkedin.com
cdn.syndication.twimg.com
Remembers the user's selected language version of a websiteSessionHTTP
__jiddisqus.comUsed to add comments to the website and remember the user's Disqus login credentials across websites that use said service.SessionHTTP
languageslideshare.netSaves the user's preferred language on the website.SessionHTTP
These cookies collect information about how visitors use our Website, for instance, the number of visits, which pages visitors go to most often, and if they get error messages from web pages. These cookies don’t collect information that identifies a visitor.  These cookies allow us to count visits and traffic sources so we can measure and improve the performance of our site. If you do not allow these cookies we will not know when you have visited our site, and will not be able to monitor its performance.
NameProviderPurposeExpiryType
_dc_gtm_UA-#about.gitlab.comUsed by Google Tag Manager to control the loading of a Google Analytics script tag.SessionHTTP
_ga [x2]about.gitlab.com
teleport.org
Registers a unique ID that is used to generate statistical data on how the visitor uses the website.2 yearsHTTP
_gat [x2]about.gitlab.com
teleport.org
Used by Google Analytics to throttle request rateSessionHTTP
_gid [x2]about.gitlab.com
teleport.org
Registers a unique ID that is used to generate statistical data on how the visitor uses the website.SessionHTTP
driftt_aidabout.gitlab.comAnonymous identifier token2 yearsHTTP
__utma [x3]disqus.com
slideshare.net
speakerdeck.com
Collects data on the number of times a user has visited the website as well as dates for the first and most recent visit. Used by Google Analytics.2 yearsHTTP
__utmb [x3]disqus.com
slideshare.net
speakerdeck.com
Registers a timestamp with the exact time of when the user accessed the website. Used by Google Analytics to calculate the duration of a website visit.SessionHTTP
__utmc [x3]disqus.com
slideshare.net
speakerdeck.com
Registers a timestamp with the exact time of when the user leaves the website. Used by Google Analytics to calculate the duration of a website visit.SessionHTTP
__utmt [x3]disqus.com
slideshare.net
speakerdeck.com
Used to throttle the speed of requests to the server.SessionHTTP
__utmz [x3]disqus.com
slideshare.net
speakerdeck.com
Collects data on where the user came from, what search engine was used, what link was clicked and what search term was used. Used by Google Analytics.6 monthsHTTP
disqus_uniquedisqus.comCollects statistics related to the user's visits to the website, such as number of visits, average time spent on the website and loaded pages.1 yearHTTP
_mkto_trkgitlab.comAnonymous web activity in browser for Marketo2 yearsHTTP
optimizelyEndUserIdgitlab.comUsed to measure how selected users react to targeted changes to the website's content and functionality, in order to determine what variation is most efficacious in terms of converting users to customers.179 daysHTTP
__utm.gifgoogle-analytics.comGoogle Analytics Tracking Code that logs details about the visitor's browser and computer.SessionPixel
_uv_idslideshare.netCollects data on the user's visits to the website, such as which pages have been read.2 yearsHTTP
vuidvimeo.comCollects data on the user's visits to the website, such as which pages have been read.2 yearsHTTP
@@History/@@scroll|# [x5]about.gitlab.com
disqus.com
optimizely.com
twitter.com
youtube.com
UnclassifiedPersistentHTML
These cookies may be set through our site by our advertising partners. They may be used by those companies to build a profile of your interests and show you relevant adverts on other websites. They do not store directly personal information, but are based on uniquely identifying your browser and internet device. If you do not allow these cookies, you will experience less targeted advertising.
NameProviderPurposeExpiryType
d-a8e6about.gitlab.comUsed by Accolade - https://www.accolade.com/privacy-policy. It is an advertising cookie29 daysHTTP
driftt_sidabout.gitlab.comIdentifier token for a specific browser session.SessionHTTP
st-shabout.gitlab.comSwiftype - https://swiftype.com/privacy99 yearsHTTP
BizoIDads.linkedin.comRegisters anonymised user data, such as IP address, geographical location and what ads the user has clicked with the pupose of optimising ad display based on user's movements on website directly related to displaying ads from LinkedIn. 179 daysHTTP
UserMatchHistoryads.linkedin.comCollects anonymous data related to user's visits to the website with the purpose of displaying targeting ads from LinkedIn. 179 daysHTTP
cbidswitch.netRegulates synchronisation of user identification and exchange of user data between various ad services.1 yearHTTP
tuuidbidswitch.netRegisters whether or not the user has consented to the use of cookies.1 yearHTTP
tuuid_lubidswitch.netRegisters preferred language1 yearHTTP
CMDDcasalemedia.comCollects anonymous data related to the user's visits to the website, such as the number of visits, average time spent on the website and what pages have been loaded, with the purpose of displaying targeted ads.SessionHTTP
CMIDcasalemedia.comCollects anonymous data related to the user's visits to the website, such as the number of visits, average time spent on the website and what pages have been loaded, with the purpose of displaying targeted ads.1 yearHTTP
CMPROcasalemedia.comCollects anonymous data related to the user's visits to the website with the purpose of displaying targeted ads. 3 monthsHTTP
CMPScasalemedia.comCollects anonymous data related to the user's visits to the website, such as the number of visits, average time spent on the website and what pages have been loaded, with the purpose of displaying targeted ads.3 monthsHTTP
CMRUM3casalemedia.comCollects anonymous data related to the user's visits to the website, such as the number of visits, average time spent on the website and what pages have been loaded, with the purpose of displaying targeted ads.1 yearHTTP
CMSCcasalemedia.comCollects anonymous data related to the user's visits to the website, such as the number of visits, average time spent on the website and what pages have been loaded, with the purpose of displaying targeted ads.SessionHTTP
CMSTcasalemedia.comCollects anonymous data related to the user's visits to the website, such as the number of visits, average time spent on the website and what pages have been loaded, with the purpose of displaying targeted ads.SessionHTTP
__adrolld.adroll.comRegisters a unique ID that identifies a returning user's device. The ID is used for targeted ads.1 yearHTTP
disqusauthdisqus.comAllow users to comment in section via third-party software ‘Disqus’.SessionHTTP
GFE_RTTdocs.google.comRelated to Google docsSessionHTTP
Sdocs.google.comRelated to Google SheetsSessionHTTP
IDEdoubleclick.netUsed by Google DoubleClick to register and report the website user's actions after viewing or clicking one of the advertiser's ads with the purpose of measuring the efficacy of an ad and to present targeted ads to the user.1 yearHTTP
test_cookiedoubleclick.netUsed to check if the user's browser supports cookies.SessionHTTP
DRIVE_STREAMdrive.google.comGoogle DriverSessionHTTP
frfacebook.comUsed by Facebook to deliver a series of advertisement products such as real time bidding from third party advertisers.3 monthsHTTP
trfacebook.comUsed by Facebook to deliver a series of advertisement products such as real time bidding from third party advertisers.SessionPixel
optimizelyDomainTestCookiegitlab.comUsed to check if the user's browser supports cookies.179 daysHTTP
ads/ga-audiencesgoogle.comUsed by Google AdWords to re-engage visitors that are likely to convert to customers based on the visitor's online behaviour across websites.SessionPixel
ads/user-lists/#google.comUsed by Google AdWords to re-engage visitors across the web in ad groupsSessionPixel
NIDgoogle.comRegisters a unique ID that identifies a returning user's device. The ID is used for targeted ads.6 monthsHTTP
collectgoogle-analytics.comUsed to send data to Google Analytics about the visitor's device and behaviour. Tracks the visitor across devices and marketing channels.SessionPixel
bcookie [x2]linkedin.com
slideshare.net
Used by the social networking service, LinkedIn, for tracking the use of embedded services.2 yearsHTTP
bscookielinkedin.comUsed by the social networking service, LinkedIn, for tracking the use of embedded services.2 yearsHTTP
lidclinkedin.comUsed by the social networking service, LinkedIn, for tracking the use of embedded services.SessionHTTP
iopenx.netRegisters anonymised user data, such as IP address, geographical location, visited websites, and what ads the user has clicked, with the purpose of optimising ad display based on the user's movement on websites that use the same ad network.1 yearHTTP
KRTBCOOKIE_#pubmatic.comRegisters a unique ID that identifies the user's device during return visits across websites that use the same ad network. The ID is used to allow targeted ads.399 daysHTTP
PUBMDCIDpubmatic.comRegisters a unique ID that identifies the user's device during return visits across websites that use the same ad network. The ID is used to allow targeted ads.3 monthsHTTP
ck1rlcdn.comCollects anonymous data related to the user's visits to the website, such as the number of visits, average time spent on the website and what pages have been loaded, with the purpose of displaying targeted ads.179 daysHTTP
rlas3rlcdn.comCollects anonymous data related to the user's visits to the website, such as the number of visits, average time spent on the website and what pages have been loaded, with the purpose of displaying targeted ads.179 daysHTTP
UIDscorecardresearch.comCollects information of the user and his/her movement, such as timestamp for visits, most recently loaded pages and IP address. The data is used by the marketing research network, Scorecard Research, to analyse traffic patterns and carry out surveys to help their clients better understand the customer's preferences.2 yearsHTTP
UIDRscorecardresearch.comCollects information of the user and his/her movement, such as timestamp for visits, most recently loaded pages and IP address. The data is used by the marketing research network, Scorecard Research, to analyse traffic patterns and carry out surveys to help their clients better understand the customer's preferences.2 yearsHTTP
__ar_v4storify.comOptimises ad display based on the user's movement combined and various advertiser bids for displaying user ads.2083 daysHTTP
_te_storify.comRegisters a unique ID that identifies a returning user's device. The ID is used for targeted ads.SessionHTTP
i18nextstorify.comPart of the Storify platform, which saves and converts content from social media to news-related stories.SessionHTTP
t_gidtaboola.comThis cookie gives a user who interacts with the Taboola widget a User ID that is used for attribution and reporting. 1 yearHTTP
taboola_usgtaboola.comThis cookie keeps track of user segmentation within Taboola.1 yearHTTP
GPSyoutube.comRegisters a unique ID on mobile devices to enable tracking based on geographical GPS location.SessionHTTP
PREFyoutube.comRegisters a unique ID that is used by Google to keep statistics of how the visitor uses YouTube videos across different websites.8 monthsHTTP
VISITOR_INFO1_LIVEyoutube.comTries to estimate the users' bandwidth on pages with integrated YouTube videos.179 daysHTTP
YSCyoutube.comRegisters a unique ID to keep statistics of what videos from YouTube the user has seen.SessionHTTP
webevents/visitWebPage194-vvc-221.mktoresp.comUnclassifiedSessionPixel
tluid3lift.comUnclassified3 monthsHTTP
optimizely_data$#$event_queueabout.gitlab.comUnclassifiedPersistentHTML
optimizely_data$#$eventsabout.gitlab.comUnclassifiedPersistentHTML
optimizely_data$#$layer_statesabout.gitlab.comUnclassifiedPersistentHTML
optimizely_data$#$session_stateabout.gitlab.comUnclassifiedPersistentHTML
optimizely_data$#$tracker_optimizelyabout.gitlab.comUnclassifiedPersistentHTML
optimizely_data$#$variation_mapabout.gitlab.comUnclassifiedPersistentHTML
optimizely_data$#$visitor_profileabout.gitlab.comUnclassifiedPersistentHTML
s-9da4about.gitlab.comUnclassifiedSessionHTTP
cc.jscc.swiftype.comUnclassifiedSessionPixel
ahoy_track [x2]codepen.io
s.codepen.io
UnclassifiedSessionHTTP
ahoy_visit [x2]codepen.io
s.codepen.io
UnclassifiedSessionHTTP
ahoy_visitor [x2]codepen.io
s.codepen.io
Unclassified2 yearsHTTP
codepen_sessioncodepen.ioUnclassified29 daysHTTP
juggler/event.gifdisqus.comUnclassifiedSessionPixel
dcgitlab.comUnclassifiedSessionHTTP
adrloutbrain.comUnclassified3 monthsHTTP
PugTpubmatic.comUnclassified29 daysHTTP
rtn1-zrlcdn.comUnclassified179 daysHTTP
SERVERIDslideshare.netUnclassifiedSessionHTTP
_secure_speakerd_sessionspeakerdeck.comUnclassified13 daysHTTP
peekspeakerdeck.comUnclassifiedSessionHTTP
mp_#_mixpanel [x2]sundial.teleport.org
teleport.org
Unclassified1 yearHTTP
__st_user_uuidswiftype.comUnclassified10 yearsHTTP
zapforeversessionzapier.comUnclassified1 yearHTTP
zapsessionzapier.comUnclassified6 daysHTTP
Unclassified cookies are cookies that we are in the process of classifying, together with the providers of individual cookies.
We do not use cookies of this type
Cookies are small text files that can be used by websites to make a user's experience more efficient.

The law states that we can store cookies on your device if they are strictly necessary for the operation of this site. For all other types of cookies we need your permission.

This site uses different types of cookies. Some cookies are placed by third party services that appear on our pages.

You can at any time change or withdraw your consent from the Cookie Declaration on our website.

Learn more about who we are, how you can contact us and how we process personal data in our Privacy Policy.
Cookie declaration last updated on 24/05/2018 by Cookiebot
Jun 15, 2018 - Dimitrie Hoekstra    

Meet the GitLab Web IDE

Here's how we went from a proof of concept to a new feature that makes it even easier for everyone to edit inside of GitLab.

GitLab has been doing much more for the application development workflow than just source code management and versioning for a while – now spanning everything from portfolio management to the complete DevOps lifecycle. Having everyone work from and be familiar with the same interface has many advantages.

All that code that gets automatically tested and deployed to production has a human at its source though. With the speed of innovation in today’s web development, we saw a chance to help out both new as well as seasoned developers with writing, reviewing, and committing that code with more confidence. In GitLab 10.7 we released the first iteration of our Web IDE – here's how it happened.

From experiment towards product

The original idea came from staff developer Jacob Schatz, who observed how non-developers were having a hard time editing multiple files and getting those changes committed.

Although having discussed implementing an Integrated Development Environment (IDE) into GitLab with our CEO Sid and VP of Product Job before, it was never clear how to do that and what exact problems it would solve.

At some point, it dawned on us that the repository view might be the right vessel. Jacob set up a proof of concept where he made our file viewer work in the context of a file editor. It removed the page refresh when switching between files and it approached editing from a branch perspective instead of per file. The result was the beginning of the Web IDE, although it was called the "repo editor" at that time.

Proof of concept multi-file editor

Setting up that proof of concept was a tremendous amount of work and was time-boxed to one month. Jacob also had other responsibilities, and there was still a long way to go from concept to minimal viable product (MVP).

Product, UX, and other developers got involved to see if this could be pushed towards production. The concept solved a problem, but did it align with our vision? How could we holistically integrate this and make it a great experience? How could we get it to perform well for many different users?

The next phase

It took some time, but it was clear that we were aiming for a real integrated development experience, accessible for everyone right within the GitLab UI, without anything to install. The idea grew from the "Repo editor" into that of the "Web IDE."

GitLab itself is open source (or rather open core) and relies on many open source projects for its development. Jacob had already decided that the Monaco editor was the perfect code editor to integrate. It had already proven itself within different contexts, was great for performance, and so could be considered a boring solution.

Our UX manager Sarrah Vesselov did the initial design for the concept after which it got passed on to me. It was up to our platform product manager James Ramsay and me as UX Designer to redefine the prototype "multi-file editor" into the foundation capable of supporting our vision of an Integrated Development Environment with live previews and web terminals, that enables anyone to contribute.

Iterating on user experience

An integrated editor

The original "multi-file editor" was about committing multiple changes at once because this was annoying when updating the handbook or docs. Often those changes touched multiple files. It was a prototype that made it easier for people to contribute.

The more we thought about this idea, the greater the possibilities became. One of GitLab's unique advantages is being an integrated product. Building an editor that was integrated with GitLab and made it easier for anyone to contribute is a natural fit. However, the starting point of a prototype in the file list and blob editor wouldn't have been enough to handle this. Decoupling this was the first actionable item.

One of GitLab's unique advantages is being an integrated product. Building an editor that was integrated with GitLab and made it easier for anyone to contribute is a natural fit.

This change was where the project pivoted towards its new direction. The Web IDE got a lot more screen real estate as it no longer had to make room for the project sidebar and other page elements. We decided that the Web IDE would edit one branch at a time only and conceptualized the initial Git flow into the editor. Based on existing UI paradigms and inspired by other code editors like VSCode and Atom, we arrived at the well-known, three-pane layout.

multi file editor concept web ide file editor concept

Even seasoned developers were once beginners, and getting new people accustomed to the Git workflow continues to be notoriously hard to tackle. We decided therefore that the core of the Web IDE experience should be stable before we can venture into more advanced concepts. We set out to make the "editing to committing" experience as good as possible and to create a foundation on which we can expand.

Even while having these discussions, development never stood still. We quickly had a working version of the Web IDE that relied on the Monaco editor. Our immediate efforts pushed towards getting that to a functional, viable state.

A review state

Due to the potency of the Monaco editor, it became clear we had many options to choose from as to what to develop next. A review state was high up on that list, as it should be obvious what you are going to commit. Not only that, it introduced the possibility of being able to have an integrated merge request review experience in the context of the editing experience – something that has not been possible before.

This introduced the problem of managing states. After much discussion, we decided to go for editor states instead of file-specific states. Both the user perspective as well as the technical implementation benefited from this as it reduced complexity. It meant you were either editing your files or reviewing your changes across the files you had opened.

Web IDE edit and review states

At this point, we are nearing the current state of the Web IDE, though in GitLab 10.8 we could finally realize the "editing to committing" experience that we talked about before and which was conceptualized and prototyped while developing GitLab 10.7. This was made possible as development reached a more stable state.

Deciding on hierarchy

The new experience had several objectives. It needed to introduce a more logical hierarchy for the panes to operate in. Based on that we could decide which panes would potentially show what information and where we could fit in any future more advanced features.

The second objective was to guide the user more intuitively from editing to committing. The editing and reviewing experience up until then showed its shortcomings as it was hard to switch modes and unclear when you were doing a good job. If even seasoned developers had a hard time using it, how could people just starting out ever hope to successfully contribute making use of it? James and I went through many concepts and discussed both flow and hierarchy before getting into detailed mockups. Through the iterations, it became apparent we preferred our hierarchy to act from left to right. We decided we needed a similar paradigm as the activity bar shown in VSCode. The editor became far more usable as state changes were just one click away, regardless of which state you were already using. As committing was now a separate state as well, it brought a linearity to the entire flow as seen from the activity bar.

The last significant detail, which came out of a discarded design iteration, was a button to guide the user towards committing their changes. It introduced a little section at the bottom of each state with a blue commit button and a counter so you can see how many changes you have made – essential as we repurposed the right sidebar.

web ide revised concept edit mode web ide revised concept review mode web ide revised concept commit mode

Interested to see all iterations the concepts have gone through? Check out my Web IDE directory in GitLab's open source design library where we contribute all our design files!

Just the beginning

The current state of the Web IDE is still only the beginning. We are planning for an even better experience in the future: one where we can integrate and support more advanced features, such as a live environment to test your code against and code review discussions which are directly resolvable.

In GitLab 11.0, shipping next Friday, we will already have the following improvements: you will be able to view the latest pipeline status and the job logs directly in context, and you will be able to quickly switch between both assigned and authored merge requests without leaving the Web IDE!

This and more will inevitably lead towards more interesting design decisions to be made. Some of these concepts are uncharted territory and are sure to be valuable to further speed up development and give developers more confidence. Our hope is that this is a valuable contribution to both the open source community as well as GitLab itself.

Do you have great ideas to push this effort forwards or want to contribute yourself? Check out the issue tracker!

Install GitLab in 2 minutes

With Ubuntu, Debian, CentOS, openSUSE, and Raspbian packages or from source

Install GitLab Now