[{"data":1,"prerenderedAt":718},["ShallowReactive",2],{"/en-us/blog/publishing-obsidian-notes-with-gitlab-pages/":3,"navigation-en-us":34,"banner-en-us":463,"footer-en-us":480,"Scott Hampton":690,"next-steps-en-us":703},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":16,"config":24,"_id":27,"_type":28,"title":29,"_source":30,"_file":31,"_stem":32,"_extension":33},"/en-us/blog/publishing-obsidian-notes-with-gitlab-pages","blog",false,"",{"title":9,"description":10,"ogTitle":9,"ogDescription":10,"noIndex":6,"ogImage":11,"ogUrl":12,"ogSiteName":13,"ogType":14,"canonicalUrls":12,"schema":15},"Publishing Obsidian.md notes with GitLab Pages","How to publish your Obsidian.md documents to a GitLab Pages site","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663397/Blog/Hero%20Images/logoforblogpost.jpg","https://about.gitlab.com/blog/publishing-obsidian-notes-with-gitlab-pages","https://about.gitlab.com","article","\n                        {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": \"Publishing Obsidian.md notes with GitLab Pages\",\n        \"author\": [{\"@type\":\"Person\",\"name\":\"Scott Hampton\"}],\n        \"datePublished\": \"2022-03-15\",\n      }",{"title":9,"description":10,"authors":17,"heroImage":11,"date":19,"body":20,"category":21,"tags":22},[18],"Scott Hampton","2022-03-15","[Obsidian.md](https://obsidian.md) is a \"knowledge base\" application that\nuses plain text Markdown files stored in a local folder to\n\norganize your notes. The product has been growing in popularity, partly\nbecause of how extensible it is. There are a\n\nlot of community built plugins to help users configure the application to\nsupport their specific workflow. There are\n\nmany people that use Obsidian to write their blog posts. [Obsidian offers a\npaid service to publish your notes directly](https://obsidian.md/publish)\n\nand is completely compatible with features Obsidian offers. I suggest you\nsupport the Obsidian developers if their product\n\nworks for you. If you are looking for an alternative way to publish, this\nblog post provides a tutorial for how to publish your notes using GitLab\n\nPages.\n\n\nYou can find an Obsidian.md example in [this demonstration\nproject](https://gitlab.com/gitlab-org/frontend/playground/obsidian-and-gitlab-pages-demo)\n\nwhich deploys [a GitLab Pages\nsite](https://gitlab-org.gitlab.io/frontend/playground/obsidian-and-gitlab-pages-demo/). \n\n\n## What is Obsidian markdown?\n\n\nObsidian is markdown-based system, which means it incorporates tags, plugins\nand backlinks to create an easy-to-use system. It makes it possible for you\nto use symbols inside the text that are interpreted as text formatting. This\n[link](https://www.markdownguide.org/cheat-sheet/) is a cheat sheet of all\nthe mardown syntax elements.\n\n\n### Benefits of Obsidian.md\n\n\nPerhaps the most significant benefit of Obsidian markdown (md) is its\nsimple, straightforward design and the excellent support provided. It is\nalso extensible, with plenty of community plugins available. \n\n\nThere is no proprietary formatting, encoding. This gives you greater control\nover how you backup files and manage change tracking.\n\n\nObsidian doesn't support git right out the box, it requires a community\nplugin called Obsidian Git. However, one the plugin is installed, “you end\nup with the greatest change tracking/archiving tool at your disposal,” one\nuser\n[raves](https://www.faesel.com/blog/why-every-developer-needs-to-use-obsidian).\n\n\n### How is Obsidian.md different from other markdown languages?\n\n\nObsidian markdown [differs from other markdown\neditors](https://cylab.be/blog/149/what-is-obsidianmd-and-why-you-should-use-it)\nin that it uses the “Linked Thought” feature, which refers to a group of\nnote-taking applications that allow you to link thoughts and notes together\nseamlessly. Because it is based on the [Markdown\nlanguage](https://en.wikipedia.org/wiki/Markdown), it is light-weight. The\ntool expands on the markdown language with additional functionality, such as\ncreating links between files, offering \"hover over preview\" of links and\neasy inclusion and management of sources.\n\n\nFor example, Obsidian lets you hover over any links added to a document and\nsee a small preview of what the links refers to. You just need to position\nyour mouse over the \"Format your notes\" link.\n\n\n### Some notable features of Obsidian.md\n\n\nThere’s a visually-striking graph view that’s acts as a map of all your\nfiles stored in Obsidian. There is also a markdown format importer that can\nfind and replace certain Markdown syntax elements in your files, and support\nfor [math and\ndiagram](https://publish.obsidian.md/help/How+to/Format+your+notes) syntax.\n\n\nAlso noteworthy is that Obsidian makes it easy to publish notes online and\nit stores all of your files in plaintext markdown files.\n\n\nObsidian supports CommonMark and GitHub Flavored Markdown (GFM) so you can\nembed notes and other files. It stores data in folders of markdown files so\nyou can access your notes with other text editors or markdown apps. Obsidian\nalso lets you open existing folders of markdown files.\n\n\n## Is Obsidian good for notes?\n\n\nObsidian is a very capable, free note-taking app (with advanced, paid tiers\navailable as well). It touts itself as a [“second\nbrain”](https://obsidian.md/) that is good for creating a knowledge base,\nmarkdown file editor and linking notes together. It is designed to take\nnotes quickly and is easy to use, making it an ideal app. You just open the\napp, create a new note and start typing.\n\n\nIt works across multiple platforms, including Windows, iOS, Android and\nLinux.\n\n\nObsidian has been called the [“most advanced note-taking\napp.”](https://deskoflawyer.com/secure-note-taking-apps/)\n\n\n## Setting up Obsidian notes\n\n\nOnce you download the app, you will see the main Obsidian window, which has\nthe different options on the left, then the folder/files panel and the\ncomposition area where you an create and edit your notes.\n\n\nThere are four icons on the left side: collapse panel, open quick switcher,\nopen graph view, and open markdown importer. The collapse panel shows (or\nhides) the left panel.When you tap the open quick switcher button, it brings\nup a text box where you can begin to type. The open graph view shows a graph\nlisting the connections each page has. The open markdown importer lets you\nimport markdown files into Obsidian from other applications.\n\n\nYou’ll also see three buttons: \n\n\n1. Open another vault \n\n2. Help\n\n3. Settings\n\n\nThe vault refers to a collection of notes that you can open or create.\n\n\nYou have the option of either creating a note directly or creating a note\nvia a link. In the former instance, in the folder panel, click on the “new\nnote” button or use the keyboard shortcut for Windows: Control N, or for\nMac: Command N. Now you’ve created a new note.\n\n\nAn interesting time-saving feature is that you can create a note via a link\nand assign a name to that new note. You have to click on the link to\nactually create it.\n\n\nYou can find a helpful guide\n[here](https://www.sitepoint.com/obsidian-beginner-guide/).\n\n\n## Organizing an Obsidian note using folders\n\n\nWhen you begin using Obsidian you have to designate where you want to keep\nyour notes. If you already have your notes in markdown format in a folder,\nyou would choose the “open folder as vault” option. Otherwise, you can\ncreate a new vault and choose a location to store your notes.\n\n\nYou can drag and drop notes to move them around. There are three icons at\nthe top pane that allow you to create a new note, make a new folder, or\nchange the sorting order.\n\n\nObsidian has a powerful search feature that checks the content of your notes\nand returns all results very quickly. Access it by clicking on the\nmagnifying glass icon at the top to begin a  search of your notes.\n\n\nYou’ll already be in editor mode by default when you open Obsidian and you\ncan edit your notes or write new ones. All markdown syntax is visible in\nthis mode. Press Ctrl + E to switch to preview mode, and the syntax will\ndisappear and the note will appear formatted.\n\n\nIf you type a hashtag before a word, Obsidian will detect it and assign it\nto the note, regardless of where it is in your text.\n\n\n## Get going with Obsidian.md\n\n\n[Obsidan.md](https://obsidian.md), at it's core, is an application that\nhelps manage your markdown files. You can download the application\n\nvia their site and create a \"workspace\" folder when you first start the\napplication. When using the application, all of your notes\n\nwill be created in the folder you choose as your \"workspace\".\n\n\n![Obsidian\napplication](https://about.gitlab.com/images/blogimages/obsidian_md.png){:\n.shadow}\n\n\n### Workspace file structure\n\n\nInside your Obsidian workspace, you can have any number of folders and\nmarkdown files. When you open a folder in Obsidian as your \"workspace\",\n\nObsidian will automatically add a folder `.obsidian`, which contains your\nworkspace configuration such as application styles and plugins.\n\nA basic workspace file structure could look something like this:\n\n\n```\n\n.\n\n├── workspace_folder/\n\n│   └── Other pages/\n\n│   │   └── Another page.md\n\n│   └── .obsidian\n\n│   └── index.md\n\n```\n\n\n`index.md`\n\n```markdown\n\n# Home\n\n\nThis is a basic home page, and a link to another page in my documents.\n\n\nSee [[Another page]] - note that this link uses wikilinks which Obsidian\nuses to help you easily link to other notes in your workspace.\n\n```\n\n\n`Other pages/Another page.md`\n\n```markdown\n\n# Another page\n\n\nThis is another page besides the home page.\n\n```\n\n\n## Generating a static site to host your notes\n\n\nIn order to publish your notes to GitLab Pages, you need to create a static\nsite to show and navigate your notes.\n\nThere are several open source tools that generate static sites from Markdown\ndocuments. After experimenting\n\nwith a few, I found [MkDocs](https://www.mkdocs.org/) to be the easiest and\nmost compatible with Obsidian.\n\n\nIf you would like to use MkDocs locally, you can install it with `pip\ninstall mkdocs`\n\n(Python and [pip as package manager](https://pypi.org/project/pip/) are\nrequired).\n\nThis is not necessary, because in this tutorial we'll utilize GitLab CI\npipelines to install MkDocs and build our site.\n\n\nThere are two small steps you need to make in order to get your existing\nObsidian notes working with MkDocs.\n\n\n### File structure\n\n\nAll files that are not your workspace notes will be created outside of your\nworkspace folder. The following folder structure is\n\nhow this final demo project is going to look.\n\n\n```\n\n.\n\n├── wiki/\n\n│   └── .obsidian\n\n│   └── index.md\n\n├── .gitlab-ci.yml\n\n├── mkdocs.yml\n\n└── requirements.txt\n\n```\n\n - `wiki/` - this is your Obsidian workspace folder\n - `.obsidian` - the application configuration folder Obsidian uses for your workspace. This will not affect the site.\n - `index.md` - MkDocs looks for `index.md` in your workspace folder to use as your site's home page.\n - `.gitlab-ci.yml` - the GitLab CI configuration file used to deploy your site.\n - `mkdocs.yml` - the MkDocs configuration file use to build and customize your site.\n - `requirements.txt` - this file defines the Python package dependencies for MkDocs.\n\n### Basic MkDocs Configuration\n\n\nYou'll need to create a configuration file `mkdocs.yml` for MkDocs to know\nhow you would like your site to look.\n\nHere are the first four lines we need to configure our notes.\n\n\n```yaml\n\nsite_name: My Obsidian Notes\n\nsite_url: https://group-name.gitlab.io/repo-name\n\nsite_dir: public\n\ndocs_dir: ./wiki\n\n```\n\n\n- `site_name` - is what will be used as the main title for the web site.\n\n- `site_url` - is used as the \"canonical URL\" of the site. You will need to\nuse [the default URL provided by GitLab\nPages](https://docs.gitlab.com/ee/user/project/pages/getting_started_part_one.html#gitlab-pages-default-domain-names)\nor your custom domain here.\n\n- `site_dir` - GitLab Pages requires HTML source code to be contained in a\n`public` folder. This setting tells MkDocs to put the generated files in the\n`public` folder.\n\n- `docs_dir` - this is the relative path to your workspace folder. I like to\nname mine `wiki` because it's my personal wikipedia. You can name this\nfolder whatever you want.\n\n\nWe'll come back to this configuration file later to add more custom styles\nto your site.\n\n\n## Configuring GitLab CI\n\n\nWe need to configure a GitLab CI job to install MkDocs and build the web\nsite based on our Obsidian notes. The following\n\n`.gitlab-ci.yml` file has the basic setup for this:\n\n\n```yaml\n\nimage: python:3.8-slim\n\n\npages:\n  stage: deploy\n  script:\n    # Install all of the python packages for mkdocs\n    - pip install -r requirements.txt\n    # Build the site using mkdocs\n    # --strict aborts the build on any warnings\n    # --verbose enables verbose output so that it's easier to see what mkdocs is doing\n    # neither --strict nor --verbose are necessary if you choose not to use them\n    - mkdocs build --strict --verbose\n  artifacts:\n    paths:\n      - public\n  only:\n    - main\n```\n\n\nThis job will only run when a change is made to the default branch (`main`\nin this case).\n\n\n### Python Packages\n\n\nNote the line `pip install -r requirements.txt` in the above\n`.gitlab-ci.yml` file. This line is installing MkDocs and any\n\nadditional plugins you use to customize your site. You'll need to create a\n`requirements.txt` file for this script to work:\n\n\n```text\n\n# Documentation static site generator & deployment tool\n\nmkdocs>=1.1.2\n\n```\n\n\nWe'll come back to this `requirements.txt` file to add a couple more\npackages to customize our site later.\n\n\n## Customizing your site\n\n\nOne of the benefits of using MkDocs is that it has a lot of extensions you\ncan add on to customize your site. You can\n\nchange the theme of the site, which adjusts the colors and layout. You can\nalso add extensions that improve how your\n\nmarkdown notes are displayed and interacted with on the site.\n\n\n### Theme\n\n\nMkDocs includes two built-in themes (`mkdocs` and `readthedocs`), [as\ndocumented on their\nwebsite](https://www.mkdocs.org/user-guide/choosing-your-theme/).\n\nThere are also a lot of [community built\nthemes](https://github.com/mkdocs/mkdocs/wiki/MkDocs-Themes) you can search\nthrough and choose to use.\n\nMy current favorite theme is\n[Material](https://github.com/mkdocs/mkdocs/wiki/MkDocs-Themes#material-for-mkdocs-).\nYou can install it by adding it our `requirements.txt` and choosing\n\nit as your theme in the `mkdocs.yml` configuration file, or if you are\ninstalling it locally you can install it with `pip install mkdocs-material`.\n\n\n`requirements.txt`\n\n```text\n\n# Material theme\n\nmkdocs-material>=8.1.7\n\n```\n\n\n`mkdocs.yml`\n\n```yaml\n\ntheme:\n  name: material\n  palette:\n    scheme: slate\n```\n\n\nI have chosen the `slate` scheme for the material theme which makes it\ndarker. You can choose more configuration options\n\nbased on [their website\ndocumentation](https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/).\n\n\n### Extensions\n\n\nMkDocs includes [built-in\nextensions](https://www.mkdocs.org/user-guide/configuration/#markdown_extensions)\nthat you can add to your `mkdocs.yml` configuration file. The\n\n[Material](https://github.com/mkdocs/mkdocs/wiki/MkDocs-Themes#material-for-mkdocs-)\ntheme package also comes with many more extensions that we can use. Below\nare some of my favorite\n\nfor working with Obsidian:\n\n\n```yaml\n\n# Extensions\n\nmarkdown_extensions:\n  - footnotes\n  - attr_list\n  - pymdownx.highlight\n  - pymdownx.superfences\n  - pymdownx.details\n  - pymdownx.magiclink\n  - pymdownx.tasklist\n  - pymdownx.emoji\n  - admonition\n  - toc:\n    permalink: true\n```\n\n\n- `footnotes` - adds the ability to define inline footnotes, whech are then\nrendered below all Markdown content of a document. [See documentation\nhere](https://squidfunk.github.io/mkdocs-material/reference/footnotes/).\n\n- `attr_list` - allows you to add HTML attributes and CSS classes to almost\nevery Markdown inline and block-level element with special syntax. [See\ndocumentation\nhere](https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#attribute-lists).\n\n- `pymdownx.highlight` - adds support for syntax highlighting of code\nblocks. [See documentation\nhere](https://facelessuser.github.io/pymdown-extensions/extensions/highlight/).\n\n- `pymdownx.superfences` - allows for arbitrary nesting of code and content\nblocks inside each other. [See documentation\nhere](https://facelessuser.github.io/pymdown-extensions/extensions/superfences/).\n\n- `pymdownx.details` - allows for creating collapsible content blocks. [See\ndocumentation\nhere](https://facelessuser.github.io/pymdown-extensions/extensions/details/).\n\n- `pymdownx.magiclink` - provides a number of useful link related features\nsuch as auto-link HTML and emails. [See documentation\nhere](https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/).\n\n- `pymdownx.tasklist` - adds support for tasklist syntax. [See documentation\nhere](https://facelessuser.github.io/pymdown-extensions/extensions/tasklist/).\n\n- `pymdownx.emoji` - adds support for inserting emoji via simple short names\nenclosed within colons (`:short_name:`). [See documentation\nhere](https://facelessuser.github.io/pymdown-extensions/extensions/emoji/).\n\n- `admonition` - allows you to create \"callouts\" in your documentation. [See\ndocumentation\nhere](https://squidfunk.github.io/mkdocs-material/reference/admonitions/).\n\n- `toc:permalink` - adds a table of contents to your page based on your\nmarkdown document, and ensures each link is a permanent link that can be\nreused. [See documentation\nhere](https://python-markdown.github.io/extensions/toc/).\n\n\n### Plugins\n\n\nMkDocs also has a community of plugins that add more features when building\nyour site. MkDocs includes some plugins by default that you can use in the\nconfiguration file, but in order to use community plugins you have to add\nthem to the\n\n`requirements.txt` file to be installed as packages. The following two\nplugins are ones that I've found useful, but you\n\ncan look at [the list of community plugins\nhere](https://github.com/mkdocs/mkdocs/wiki/MkDocs-Plugins):\n\n\n```yaml\n\nplugins:\n  - search\n  - roamlinks\n```\n\n\n- `search` - provides a search bar at the top of your site to easily search\nyour documents. [See documentation\nhere](https://www.mkdocs.org/user-guide/configuration/#search).\n\n- `roamlinks` - adds support for Obsidian's wikilinks feature. [See\ndocumentation here](https://github.com/Jackiexiao/mkdocs-roamlinks-plugin).\n\n\n`requirements.txt`\n\n```text\n\n# Wikilinks support\n\nmkdocs-roamlinks-plugin>=0.1.3\n\n```\n\n\nIf installing locally, you can install roamlinks with `pip install\nmkdocs-roamlinks-plugin`.\n\n\n## Combining it all together\n\n\nAfter all of the above work is done, you should have a file structure that\nlooks like this:\n\n\n```\n\n.\n\n├── wiki/\n\n│   └── .obsidian\n\n│   └── index.md\n\n├── .gitlab-ci.yml\n\n├── mkdocs.yml\n\n└── requirements.txt\n\n```\n\n\nHere are the contents of the three main files that you've been editing:\n\n\n`.gitlab-ci.yml`\n\n```yaml\n\nimage: python:3.8-slim\n\n\npages:\n  stage: deploy\n  script:\n    - pip install -r requirements.txt\n    - mkdocs build --strict --verbose\n  artifacts:\n    paths:\n      - public\n  only:\n    - main\n```\n\n\n`mkdocs.yml`\n\n```yaml\n\nsite_name: My Obsidian Notes\n\nsite_url: https://group-name.gitlab.io/repo-name\n\nsite_dir: public\n\n\ntheme:\n  name: material\n  palette:\n    scheme: slate\n\n# Extensions\n\nmarkdown_extensions:\n  - footnotes\n  - attr_list\n  - pymdownx.highlight\n  - pymdownx.superfences\n  - pymdownx.details\n  - pymdownx.magiclink\n  - pymdownx.tasklist\n  - pymdownx.emoji\n  - admonition\n  - toc:\n    permalink: true\n\nplugins:\n  - search\n  - roamlinks\n```\n\n\n`requirements.txt`\n\n```text\n\n# Documentation static site generator & deployment tool\n\nmkdocs>=1.1.2\n\n\n# Material theme\n\nmkdocs-material>=8.1.7\n\n\n# Wikilinks support\n\nmkdocs-roamlinks-plugin>=0.1.3\n\n```\n\n\nNow that your files are all finished, the last step is to push your changes\nto your GitLab repository and wait for your pipeline\n\nto finish. Once finished, you can go to [your default domain provided by\nGitLab](https://docs.gitlab.com/ee/user/project/pages/getting_started_part_one.html#gitlab-pages-default-domain-names)\nor you can\n\n[configure GitLab Pages to use a custom\ndomain](https://docs.gitlab.com/ee/administration/pages/index.html).\n\n\nHere's a screenshot of the demonstration site created in this tutorial:\n\n\n![Obsidian\napplication](https://about.gitlab.com/images/blogimages/obsidian_mkdocs_site.png){:\n.shadow}\n\n\n## Is the Obsidian note-taking secure?\n\n\nUsers overall believe Obsidian is safe to use. One user said you [maintain\nfull control](https://becomeawritertoday.com/obsidian-review/) over your\nnotes and it provides the ability to encrypt your vault.\n\n\n[This lawyer](https://deskoflawyer.com/secure-note-taking-apps/) maintains\nthat Obsidian is the most-secure note-taking app available. Others claim\nthere are [no security\nthreats](https://thebusinessblocks.com/is-obsidian-one-of-the-most-secure-and-best-notetaking-apps/)\nwith Obsidian and users don’t have to worry about data being lost or\ntransferred to third parties.\n\n\nBecause your files are stored on your own computer, this keeps your data\nsafe and private according to another\n[user](https://www.online-tech-tips.com/computer-tips/how-to-use-obsidian-as-a-personal-wiki-on-your-computer/).\n\n\n### Where to find more information on Obsidian markdown\n\n\nYou can find more information in this [Obsidian markdown\nguide](https://www.markdownguide.org/tools/obsidian/). An Obsidian roadmap\nis available [here](https://trello.com/b/Psqfqp7I/obsidian-roadmap). Of\ncourse, you can also go to the [Obsidan website](https://obsidian.md/).\n\n\nShare your Obsidian.md deployments in the comments.\n","engineering",[23],"tutorial",{"slug":25,"featured":6,"template":26},"publishing-obsidian-notes-with-gitlab-pages","BlogPost","content:en-us:blog:publishing-obsidian-notes-with-gitlab-pages.yml","yaml","Publishing Obsidian Notes With Gitlab Pages","content","en-us/blog/publishing-obsidian-notes-with-gitlab-pages.yml","en-us/blog/publishing-obsidian-notes-with-gitlab-pages","yml",{"_path":35,"_dir":36,"_draft":6,"_partial":6,"_locale":7,"data":37,"_id":459,"_type":28,"title":460,"_source":30,"_file":461,"_stem":462,"_extension":33},"/shared/en-us/main-navigation","en-us",{"logo":38,"freeTrial":43,"sales":48,"login":53,"items":58,"search":390,"minimal":421,"duo":440,"pricingDeployment":449},{"config":39},{"href":40,"dataGaName":41,"dataGaLocation":42},"/","gitlab logo","header",{"text":44,"config":45},"Get free trial",{"href":46,"dataGaName":47,"dataGaLocation":42},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":49,"config":50},"Talk to sales",{"href":51,"dataGaName":52,"dataGaLocation":42},"/sales/","sales",{"text":54,"config":55},"Sign in",{"href":56,"dataGaName":57,"dataGaLocation":42},"https://gitlab.com/users/sign_in/","sign in",[59,103,201,206,311,371],{"text":60,"config":61,"cards":63,"footer":86},"Platform",{"dataNavLevelOne":62},"platform",[64,70,78],{"title":60,"description":65,"link":66},"The most comprehensive AI-powered DevSecOps Platform",{"text":67,"config":68},"Explore our Platform",{"href":69,"dataGaName":62,"dataGaLocation":42},"/platform/",{"title":71,"description":72,"link":73},"GitLab Duo (AI)","Build software faster with AI at every stage of development",{"text":74,"config":75},"Meet GitLab Duo",{"href":76,"dataGaName":77,"dataGaLocation":42},"/gitlab-duo/","gitlab duo ai",{"title":79,"description":80,"link":81},"Why GitLab","10 reasons why Enterprises choose GitLab",{"text":82,"config":83},"Learn more",{"href":84,"dataGaName":85,"dataGaLocation":42},"/why-gitlab/","why gitlab",{"title":87,"items":88},"Get started with",[89,94,99],{"text":90,"config":91},"Platform Engineering",{"href":92,"dataGaName":93,"dataGaLocation":42},"/solutions/platform-engineering/","platform engineering",{"text":95,"config":96},"Developer Experience",{"href":97,"dataGaName":98,"dataGaLocation":42},"/developer-experience/","Developer experience",{"text":100,"config":101},"MLOps",{"href":102,"dataGaName":100,"dataGaLocation":42},"/topics/devops/the-role-of-ai-in-devops/",{"text":104,"left":105,"config":106,"link":108,"lists":112,"footer":183},"Product",true,{"dataNavLevelOne":107},"solutions",{"text":109,"config":110},"View all Solutions",{"href":111,"dataGaName":107,"dataGaLocation":42},"/solutions/",[113,138,162],{"title":114,"description":115,"link":116,"items":121},"Automation","CI/CD and automation to accelerate deployment",{"config":117},{"icon":118,"href":119,"dataGaName":120,"dataGaLocation":42},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[122,126,130,134],{"text":123,"config":124},"CI/CD",{"href":125,"dataGaLocation":42,"dataGaName":123},"/solutions/continuous-integration/",{"text":127,"config":128},"AI-Assisted Development",{"href":76,"dataGaLocation":42,"dataGaName":129},"AI assisted development",{"text":131,"config":132},"Source Code Management",{"href":133,"dataGaLocation":42,"dataGaName":131},"/solutions/source-code-management/",{"text":135,"config":136},"Automated Software Delivery",{"href":119,"dataGaLocation":42,"dataGaName":137},"Automated software delivery",{"title":139,"description":140,"link":141,"items":146},"Security","Deliver code faster without compromising security",{"config":142},{"href":143,"dataGaName":144,"dataGaLocation":42,"icon":145},"/solutions/security-compliance/","security and compliance","ShieldCheckLight",[147,152,157],{"text":148,"config":149},"Application Security Testing",{"href":150,"dataGaName":151,"dataGaLocation":42},"/solutions/application-security-testing/","Application security testing",{"text":153,"config":154},"Software Supply Chain Security",{"href":155,"dataGaLocation":42,"dataGaName":156},"/solutions/supply-chain/","Software supply chain security",{"text":158,"config":159},"Software Compliance",{"href":160,"dataGaName":161,"dataGaLocation":42},"/solutions/software-compliance/","software compliance",{"title":163,"link":164,"items":169},"Measurement",{"config":165},{"icon":166,"href":167,"dataGaName":168,"dataGaLocation":42},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[170,174,178],{"text":171,"config":172},"Visibility & Measurement",{"href":167,"dataGaLocation":42,"dataGaName":173},"Visibility and Measurement",{"text":175,"config":176},"Value Stream Management",{"href":177,"dataGaLocation":42,"dataGaName":175},"/solutions/value-stream-management/",{"text":179,"config":180},"Analytics & Insights",{"href":181,"dataGaLocation":42,"dataGaName":182},"/solutions/analytics-and-insights/","Analytics and insights",{"title":184,"items":185},"GitLab for",[186,191,196],{"text":187,"config":188},"Enterprise",{"href":189,"dataGaLocation":42,"dataGaName":190},"/enterprise/","enterprise",{"text":192,"config":193},"Small Business",{"href":194,"dataGaLocation":42,"dataGaName":195},"/small-business/","small business",{"text":197,"config":198},"Public Sector",{"href":199,"dataGaLocation":42,"dataGaName":200},"/solutions/public-sector/","public sector",{"text":202,"config":203},"Pricing",{"href":204,"dataGaName":205,"dataGaLocation":42,"dataNavLevelOne":205},"/pricing/","pricing",{"text":207,"config":208,"link":210,"lists":214,"feature":298},"Resources",{"dataNavLevelOne":209},"resources",{"text":211,"config":212},"View all resources",{"href":213,"dataGaName":209,"dataGaLocation":42},"/resources/",[215,248,270],{"title":216,"items":217},"Getting started",[218,223,228,233,238,243],{"text":219,"config":220},"Install",{"href":221,"dataGaName":222,"dataGaLocation":42},"/install/","install",{"text":224,"config":225},"Quick start guides",{"href":226,"dataGaName":227,"dataGaLocation":42},"/get-started/","quick setup checklists",{"text":229,"config":230},"Learn",{"href":231,"dataGaLocation":42,"dataGaName":232},"https://university.gitlab.com/","learn",{"text":234,"config":235},"Product documentation",{"href":236,"dataGaName":237,"dataGaLocation":42},"https://docs.gitlab.com/","product documentation",{"text":239,"config":240},"Best practice videos",{"href":241,"dataGaName":242,"dataGaLocation":42},"/getting-started-videos/","best practice videos",{"text":244,"config":245},"Integrations",{"href":246,"dataGaName":247,"dataGaLocation":42},"/integrations/","integrations",{"title":249,"items":250},"Discover",[251,256,260,265],{"text":252,"config":253},"Customer success stories",{"href":254,"dataGaName":255,"dataGaLocation":42},"/customers/","customer success stories",{"text":257,"config":258},"Blog",{"href":259,"dataGaName":5,"dataGaLocation":42},"/blog/",{"text":261,"config":262},"Remote",{"href":263,"dataGaName":264,"dataGaLocation":42},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":266,"config":267},"TeamOps",{"href":268,"dataGaName":269,"dataGaLocation":42},"/teamops/","teamops",{"title":271,"items":272},"Connect",[273,278,283,288,293],{"text":274,"config":275},"GitLab Services",{"href":276,"dataGaName":277,"dataGaLocation":42},"/services/","services",{"text":279,"config":280},"Community",{"href":281,"dataGaName":282,"dataGaLocation":42},"/community/","community",{"text":284,"config":285},"Forum",{"href":286,"dataGaName":287,"dataGaLocation":42},"https://forum.gitlab.com/","forum",{"text":289,"config":290},"Events",{"href":291,"dataGaName":292,"dataGaLocation":42},"/events/","events",{"text":294,"config":295},"Partners",{"href":296,"dataGaName":297,"dataGaLocation":42},"/partners/","partners",{"backgroundColor":299,"textColor":300,"text":301,"image":302,"link":306},"#2f2a6b","#fff","Insights for the future of software development",{"altText":303,"config":304},"the source promo card",{"src":305},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":307,"config":308},"Read the latest",{"href":309,"dataGaName":310,"dataGaLocation":42},"/the-source/","the source",{"text":312,"config":313,"lists":315},"Company",{"dataNavLevelOne":314},"company",[316],{"items":317},[318,323,329,331,336,341,346,351,356,361,366],{"text":319,"config":320},"About",{"href":321,"dataGaName":322,"dataGaLocation":42},"/company/","about",{"text":324,"config":325,"footerGa":328},"Jobs",{"href":326,"dataGaName":327,"dataGaLocation":42},"/jobs/","jobs",{"dataGaName":327},{"text":289,"config":330},{"href":291,"dataGaName":292,"dataGaLocation":42},{"text":332,"config":333},"Leadership",{"href":334,"dataGaName":335,"dataGaLocation":42},"/company/team/e-group/","leadership",{"text":337,"config":338},"Team",{"href":339,"dataGaName":340,"dataGaLocation":42},"/company/team/","team",{"text":342,"config":343},"Handbook",{"href":344,"dataGaName":345,"dataGaLocation":42},"https://handbook.gitlab.com/","handbook",{"text":347,"config":348},"Investor relations",{"href":349,"dataGaName":350,"dataGaLocation":42},"https://ir.gitlab.com/","investor relations",{"text":352,"config":353},"Trust Center",{"href":354,"dataGaName":355,"dataGaLocation":42},"/security/","trust center",{"text":357,"config":358},"AI Transparency Center",{"href":359,"dataGaName":360,"dataGaLocation":42},"/ai-transparency-center/","ai transparency center",{"text":362,"config":363},"Newsletter",{"href":364,"dataGaName":365,"dataGaLocation":42},"/company/contact/","newsletter",{"text":367,"config":368},"Press",{"href":369,"dataGaName":370,"dataGaLocation":42},"/press/","press",{"text":372,"config":373,"lists":374},"Contact us",{"dataNavLevelOne":314},[375],{"items":376},[377,380,385],{"text":49,"config":378},{"href":51,"dataGaName":379,"dataGaLocation":42},"talk to sales",{"text":381,"config":382},"Get help",{"href":383,"dataGaName":384,"dataGaLocation":42},"/support/","get help",{"text":386,"config":387},"Customer portal",{"href":388,"dataGaName":389,"dataGaLocation":42},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":391,"login":392,"suggestions":399},"Close",{"text":393,"link":394},"To search repositories and projects, login to",{"text":395,"config":396},"gitlab.com",{"href":56,"dataGaName":397,"dataGaLocation":398},"search login","search",{"text":400,"default":401},"Suggestions",[402,404,408,410,414,418],{"text":71,"config":403},{"href":76,"dataGaName":71,"dataGaLocation":398},{"text":405,"config":406},"Code Suggestions (AI)",{"href":407,"dataGaName":405,"dataGaLocation":398},"/solutions/code-suggestions/",{"text":123,"config":409},{"href":125,"dataGaName":123,"dataGaLocation":398},{"text":411,"config":412},"GitLab on AWS",{"href":413,"dataGaName":411,"dataGaLocation":398},"/partners/technology-partners/aws/",{"text":415,"config":416},"GitLab on Google Cloud",{"href":417,"dataGaName":415,"dataGaLocation":398},"/partners/technology-partners/google-cloud-platform/",{"text":419,"config":420},"Why GitLab?",{"href":84,"dataGaName":419,"dataGaLocation":398},{"freeTrial":422,"mobileIcon":427,"desktopIcon":432,"secondaryButton":435},{"text":423,"config":424},"Start free trial",{"href":425,"dataGaName":47,"dataGaLocation":426},"https://gitlab.com/-/trials/new/","nav",{"altText":428,"config":429},"Gitlab Icon",{"src":430,"dataGaName":431,"dataGaLocation":426},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":428,"config":433},{"src":434,"dataGaName":431,"dataGaLocation":426},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":436,"config":437},"Get Started",{"href":438,"dataGaName":439,"dataGaLocation":426},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/compare/gitlab-vs-github/","get started",{"freeTrial":441,"mobileIcon":445,"desktopIcon":447},{"text":442,"config":443},"Learn more about GitLab Duo",{"href":76,"dataGaName":444,"dataGaLocation":426},"gitlab duo",{"altText":428,"config":446},{"src":430,"dataGaName":431,"dataGaLocation":426},{"altText":428,"config":448},{"src":434,"dataGaName":431,"dataGaLocation":426},{"freeTrial":450,"mobileIcon":455,"desktopIcon":457},{"text":451,"config":452},"Back to pricing",{"href":204,"dataGaName":453,"dataGaLocation":426,"icon":454},"back to pricing","GoBack",{"altText":428,"config":456},{"src":430,"dataGaName":431,"dataGaLocation":426},{"altText":428,"config":458},{"src":434,"dataGaName":431,"dataGaLocation":426},"content:shared:en-us:main-navigation.yml","Main Navigation","shared/en-us/main-navigation.yml","shared/en-us/main-navigation",{"_path":464,"_dir":36,"_draft":6,"_partial":6,"_locale":7,"title":465,"button":466,"image":471,"config":475,"_id":477,"_type":28,"_source":30,"_file":478,"_stem":479,"_extension":33},"/shared/en-us/banner","is now in public beta!",{"text":467,"config":468},"Try the Beta",{"href":469,"dataGaName":470,"dataGaLocation":42},"/gitlab-duo/agent-platform/","duo banner",{"altText":472,"config":473},"GitLab Duo Agent Platform",{"src":474},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1753720689/somrf9zaunk0xlt7ne4x.svg",{"layout":476},"release","content:shared:en-us:banner.yml","shared/en-us/banner.yml","shared/en-us/banner",{"_path":481,"_dir":36,"_draft":6,"_partial":6,"_locale":7,"data":482,"_id":686,"_type":28,"title":687,"_source":30,"_file":688,"_stem":689,"_extension":33},"/shared/en-us/main-footer",{"text":483,"source":484,"edit":490,"contribute":495,"config":500,"items":505,"minimal":678},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":485,"config":486},"View page source",{"href":487,"dataGaName":488,"dataGaLocation":489},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":491,"config":492},"Edit this page",{"href":493,"dataGaName":494,"dataGaLocation":489},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":496,"config":497},"Please contribute",{"href":498,"dataGaName":499,"dataGaLocation":489},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":501,"facebook":502,"youtube":503,"linkedin":504},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[506,529,585,614,648],{"title":60,"links":507,"subMenu":512},[508],{"text":509,"config":510},"DevSecOps platform",{"href":69,"dataGaName":511,"dataGaLocation":489},"devsecops platform",[513],{"title":202,"links":514},[515,519,524],{"text":516,"config":517},"View plans",{"href":204,"dataGaName":518,"dataGaLocation":489},"view plans",{"text":520,"config":521},"Why Premium?",{"href":522,"dataGaName":523,"dataGaLocation":489},"/pricing/premium/","why premium",{"text":525,"config":526},"Why Ultimate?",{"href":527,"dataGaName":528,"dataGaLocation":489},"/pricing/ultimate/","why ultimate",{"title":530,"links":531},"Solutions",[532,537,539,541,546,551,555,558,562,567,569,572,575,580],{"text":533,"config":534},"Digital transformation",{"href":535,"dataGaName":536,"dataGaLocation":489},"/topics/digital-transformation/","digital transformation",{"text":148,"config":538},{"href":150,"dataGaName":148,"dataGaLocation":489},{"text":137,"config":540},{"href":119,"dataGaName":120,"dataGaLocation":489},{"text":542,"config":543},"Agile development",{"href":544,"dataGaName":545,"dataGaLocation":489},"/solutions/agile-delivery/","agile delivery",{"text":547,"config":548},"Cloud transformation",{"href":549,"dataGaName":550,"dataGaLocation":489},"/topics/cloud-native/","cloud transformation",{"text":552,"config":553},"SCM",{"href":133,"dataGaName":554,"dataGaLocation":489},"source code management",{"text":123,"config":556},{"href":125,"dataGaName":557,"dataGaLocation":489},"continuous integration & delivery",{"text":559,"config":560},"Value stream management",{"href":177,"dataGaName":561,"dataGaLocation":489},"value stream management",{"text":563,"config":564},"GitOps",{"href":565,"dataGaName":566,"dataGaLocation":489},"/solutions/gitops/","gitops",{"text":187,"config":568},{"href":189,"dataGaName":190,"dataGaLocation":489},{"text":570,"config":571},"Small business",{"href":194,"dataGaName":195,"dataGaLocation":489},{"text":573,"config":574},"Public sector",{"href":199,"dataGaName":200,"dataGaLocation":489},{"text":576,"config":577},"Education",{"href":578,"dataGaName":579,"dataGaLocation":489},"/solutions/education/","education",{"text":581,"config":582},"Financial services",{"href":583,"dataGaName":584,"dataGaLocation":489},"/solutions/finance/","financial services",{"title":207,"links":586},[587,589,591,593,596,598,600,602,604,606,608,610,612],{"text":219,"config":588},{"href":221,"dataGaName":222,"dataGaLocation":489},{"text":224,"config":590},{"href":226,"dataGaName":227,"dataGaLocation":489},{"text":229,"config":592},{"href":231,"dataGaName":232,"dataGaLocation":489},{"text":234,"config":594},{"href":236,"dataGaName":595,"dataGaLocation":489},"docs",{"text":257,"config":597},{"href":259,"dataGaName":5,"dataGaLocation":489},{"text":252,"config":599},{"href":254,"dataGaName":255,"dataGaLocation":489},{"text":261,"config":601},{"href":263,"dataGaName":264,"dataGaLocation":489},{"text":274,"config":603},{"href":276,"dataGaName":277,"dataGaLocation":489},{"text":266,"config":605},{"href":268,"dataGaName":269,"dataGaLocation":489},{"text":279,"config":607},{"href":281,"dataGaName":282,"dataGaLocation":489},{"text":284,"config":609},{"href":286,"dataGaName":287,"dataGaLocation":489},{"text":289,"config":611},{"href":291,"dataGaName":292,"dataGaLocation":489},{"text":294,"config":613},{"href":296,"dataGaName":297,"dataGaLocation":489},{"title":312,"links":615},[616,618,620,622,624,626,628,632,637,639,641,643],{"text":319,"config":617},{"href":321,"dataGaName":314,"dataGaLocation":489},{"text":324,"config":619},{"href":326,"dataGaName":327,"dataGaLocation":489},{"text":332,"config":621},{"href":334,"dataGaName":335,"dataGaLocation":489},{"text":337,"config":623},{"href":339,"dataGaName":340,"dataGaLocation":489},{"text":342,"config":625},{"href":344,"dataGaName":345,"dataGaLocation":489},{"text":347,"config":627},{"href":349,"dataGaName":350,"dataGaLocation":489},{"text":629,"config":630},"Sustainability",{"href":631,"dataGaName":629,"dataGaLocation":489},"/sustainability/",{"text":633,"config":634},"Diversity, inclusion and belonging (DIB)",{"href":635,"dataGaName":636,"dataGaLocation":489},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":352,"config":638},{"href":354,"dataGaName":355,"dataGaLocation":489},{"text":362,"config":640},{"href":364,"dataGaName":365,"dataGaLocation":489},{"text":367,"config":642},{"href":369,"dataGaName":370,"dataGaLocation":489},{"text":644,"config":645},"Modern Slavery Transparency Statement",{"href":646,"dataGaName":647,"dataGaLocation":489},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":649,"links":650},"Contact Us",[651,654,656,658,663,668,673],{"text":652,"config":653},"Contact an expert",{"href":51,"dataGaName":52,"dataGaLocation":489},{"text":381,"config":655},{"href":383,"dataGaName":384,"dataGaLocation":489},{"text":386,"config":657},{"href":388,"dataGaName":389,"dataGaLocation":489},{"text":659,"config":660},"Status",{"href":661,"dataGaName":662,"dataGaLocation":489},"https://status.gitlab.com/","status",{"text":664,"config":665},"Terms of use",{"href":666,"dataGaName":667,"dataGaLocation":489},"/terms/","terms of use",{"text":669,"config":670},"Privacy statement",{"href":671,"dataGaName":672,"dataGaLocation":489},"/privacy/","privacy statement",{"text":674,"config":675},"Cookie preferences",{"dataGaName":676,"dataGaLocation":489,"id":677,"isOneTrustButton":105},"cookie preferences","ot-sdk-btn",{"items":679},[680,682,684],{"text":664,"config":681},{"href":666,"dataGaName":667,"dataGaLocation":489},{"text":669,"config":683},{"href":671,"dataGaName":672,"dataGaLocation":489},{"text":674,"config":685},{"dataGaName":676,"dataGaLocation":489,"id":677,"isOneTrustButton":105},"content:shared:en-us:main-footer.yml","Main Footer","shared/en-us/main-footer.yml","shared/en-us/main-footer",[691],{"_path":692,"_dir":693,"_draft":6,"_partial":6,"_locale":7,"content":694,"config":698,"_id":700,"_type":28,"title":18,"_source":30,"_file":701,"_stem":702,"_extension":33},"/en-us/blog/authors/scott-hampton","authors",{"name":18,"config":695},{"headshot":696,"ctfId":697},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749682259/Blog/Author%20Headshots/shampton-headshot.png","shampton",{"template":699},"BlogAuthor","content:en-us:blog:authors:scott-hampton.yml","en-us/blog/authors/scott-hampton.yml","en-us/blog/authors/scott-hampton",{"_path":704,"_dir":36,"_draft":6,"_partial":6,"_locale":7,"header":705,"eyebrow":706,"blurb":707,"button":708,"secondaryButton":712,"_id":714,"_type":28,"title":715,"_source":30,"_file":716,"_stem":717,"_extension":33},"/shared/en-us/next-steps","Start shipping better software faster","50%+ of the Fortune 100 trust GitLab","See what your team can do with the intelligent\n\n\nDevSecOps platform.\n",{"text":44,"config":709},{"href":710,"dataGaName":47,"dataGaLocation":711},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":49,"config":713},{"href":51,"dataGaName":52,"dataGaLocation":711},"content:shared:en-us:next-steps.yml","Next Steps","shared/en-us/next-steps.yml","shared/en-us/next-steps",1758326263701]