{"id":1815,"date":"2020-08-14T09:36:00","date_gmt":"2020-08-14T09:36:00","guid":{"rendered":"https:\/\/bravosystems.com\/blog\/?p=1815"},"modified":"2020-09-22T10:51:12","modified_gmt":"2020-09-22T10:51:12","slug":"bravo-technology-stack","status":"publish","type":"post","link":"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/","title":{"rendered":"Bravo Technology stack"},"content":{"rendered":"\n<p>Historically, our teams were organized as separate products, each with its own technology stack, although the stacks were very similar for some teams. Now we are unifying our platforms, tools, and languages so that we can share knowledge and reuse services between teams in a better way.<\/p>\n\n\n\n<p>Below is a list of our technology stack by each development area.<\/p>\n\n\n\n<p class=\"has-text-align-center\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Infrastructure and Data\u00a0<\/strong><\/h2>\n\n\n\n<p>BravoSystems uses cloud and bare-metal servers across two data centers. For the cloud deployments, we use Amazon Web Services and it&#8217;s mostly used for new and experimental projects. Our legacy and stable projects are deployed to our datacenters. Infrastructure in our datacenters is provisioned through a mix of <a href=\"https:\/\/github.com\/ansible\/ansible\">Ansible<\/a> scripts and custom tools. We also have a <a href=\"https:\/\/kubernetes.io\/\">Kubernetes <\/a>cluster which is used in some of our product teams. For infrastructure monitoring, we use <a href=\"https:\/\/www.nagios.org\/\">Nagios<\/a> and <a href=\"https:\/\/www.zabbix.com\/\">Zabbix<\/a>.&nbsp;<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"937\" height=\"440\" src=\"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/pasted-image-0-1.png\" alt=\"\" class=\"wp-image-1825\" srcset=\"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/pasted-image-0-1.png 937w, https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/pasted-image-0-1-300x141.png 300w, https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/pasted-image-0-1-768x361.png 768w\" sizes=\"auto, (max-width: 937px) 100vw, 937px\" \/><\/figure><\/div>\n\n\n\n<p class=\"has-text-align-center\"><em>Figure 1. Part of our tech stack<\/em><\/p>\n\n\n\n<p>We also built a Platform for abstracting away infrastructure from product teams. This was an upgrade from the simple Kubernetes cluster which we already had in production. We are planning to migrate legacy products alongside all new ones that are already there.<\/p>\n\n\n\n<p>The Platform is managed through <a href=\"https:\/\/www.terraform.io\/\">Terraform<\/a>, Ansible, and <a href=\"https:\/\/github.com\/roboll\/helmfile\">Helmfile<\/a>, and the heart of the platform is Kubernetes. Deployed services are packaged using <a href=\"https:\/\/www.docker.com\/\">Docker<\/a> and <a href=\"https:\/\/helm.sh\/\">Helm<\/a>. On the ingress side, we use <a href=\"https:\/\/www.envoyproxy.io\/\">envoy<\/a> as a front proxy for Kubernetes. For the storage provider, we use <a href=\"https:\/\/portworx.com\/\">Portworx<\/a> &#8211; cloud-native storage and data management platform. The Platform also provides monitoring and centralized logging based on <a href=\"https:\/\/prometheus.io\/\">Prometheus<\/a>, <a href=\"https:\/\/github.com\/grafana\/loki\">Loki<\/a>, and <a href=\"https:\/\/grafana.com\/\">Grafana<\/a>.<\/p>\n\n\n\n<p>The important part is also CI\/CD solution which relies on all the above. With our solution, we minimize efforts to have a fully functional CI\/CD solution for any team.<\/p>\n\n\n\n<p class=\"has-text-align-center\"><\/p>\n\n\n\n<p>Since we are ingesting terabytes of data daily, we needed to set up proper data infrastructure to be able to efficiently use that data. For distributed storage, we use <a href=\"https:\/\/hadoop.apache.org\/\">Hadoop<\/a> cluster. In addition, we backup everything on <a href=\"https:\/\/aws.amazon.com\/s3\/\">AWS S3<\/a> and <a href=\"https:\/\/aws.amazon.com\/glacier\/\">Glacier<\/a>. Analytical data is currently stored in Amazon <a href=\"https:\/\/aws.amazon.com\/redshift\/\">RedShift<\/a> or <a href=\"https:\/\/github.com\/ClickHouse\/ClickHouse\">Clickhouse<\/a> and we are currently migrating to <a href=\"https:\/\/druid.apache.org\/\">Druid<\/a>. For metadata management and governance we use <a href=\"http:\/\/atlas.apache.org\/#\/\">Apache Atlas<\/a>.&nbsp;<\/p>\n\n\n\n<p>For ETL orchestration and management we use <a href=\"https:\/\/airflow.apache.org\/\">Apache Airflow<\/a> with a combination of our internal tools. For data streaming, we use <a href=\"https:\/\/kafka.apache.org\/\">Kafka<\/a>. ETLs are mostly written in Python or Java.&nbsp;<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/HeofPW9q89gTyL0hetTDgyBMFsSPMH2vGKd-eiGGdMsrgz9u-Mx8-nFC6FzNYlN7C_sNi86bppx15TY2UD24douS7mdKJ70V45E4UlwbMdzVKHIJtk37s5zLHHX6DoPIrZhhf8PB\" alt=\"\"\/><\/figure><\/div>\n\n\n\n<p class=\"has-text-align-center\"><em>Figure 2. Apache Atlas showing lineage of one of our Spark ETL jobs.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Backend\u00a0<\/strong><\/h2>\n\n\n\n<p>Our primary backend language is Java because of its performance and extensive support for external ecosystems like Apache, which we use a lot (Hadoop, Spark, Kafka..).<\/p>\n\n\n\n<p>Other languages we use are PHP and NodeJs. We use PHP in our legacy products. NodeJs is mostly used for new and experimental projects because of a faster learning curve for junior developers, so we can take those projects to market as soon as possible. Our teams use MySQL and MongoDB as the production database. Where caching is needed, we use <a href=\"https:\/\/redis.io\/\">Redis<\/a>.<\/p>\n\n\n\n<p>For the majority of tracking and logging, we use Kafka, which stores data into Hadoop using various streaming applications.&nbsp;<\/p>\n\n\n\n<p>Several teams are using <a href=\"https:\/\/www.elastic.co\/what-is\/elk-stack\">ELK<\/a> (Elasticsearch, Logstash, and Kibana) for application monitoring.&nbsp;<\/p>\n\n\n\n<p>Usually, alerting mechanisms are set up per team i.e. the team that builds a service is responsible for monitoring that service.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Frontend<\/strong><\/h2>\n\n\n\n<p>Our primary frontend language is Javascript, and we build our projects with ExtJs, VueJs, and ReactJs. For testing, we mostly use <a href=\"https:\/\/jestjs.io\/\">Jest<\/a> for the unit and <a href=\"https:\/\/devexpress.github.io\/testcafe\/\">Testcafe<\/a> for functional testing. We have also built our internal test tool based on <a href=\"https:\/\/www.selenium.dev\/\">Selenium<\/a> and <a href=\"http:\/\/doc.sikuli.org\/\">Sikuli<\/a> called Hodor for end-to-end tests which enables us to test browser extensions. We have used <a href=\"https:\/\/cucumber.io\/\">Cucumber<\/a> to write acceptance tests in one of our products.<\/p>\n\n\n\n<p>As for web servers, we use <a href=\"https:\/\/httpd.apache.org\/\">Apache HTTP<\/a> and <a href=\"https:\/\/www.nginx.com\/\">nginx<\/a>.&nbsp;<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"723\" src=\"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/pasted-image-0-2-1024x723.png\" alt=\"\" class=\"wp-image-1834\" srcset=\"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/pasted-image-0-2-1024x723.png 1024w, https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/pasted-image-0-2-300x212.png 300w, https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/pasted-image-0-2-768x542.png 768w, https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/pasted-image-0-2.png 1420w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p class=\"has-text-align-center\"><em>Figure 3. Cucumber reports showing test executions<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Development and Deployment<\/strong><\/h2>\n\n\n\n<p>Some of our legacy products are still deployed on bare-metal servers, which are managed by a centralized admin team. Also, in some teams where we use the on-prem Kubernetes cluster or AWS, that team manages deployment configuration themselves. Our in-house Platform made deployment very simple.<\/p>\n\n\n\n<p>For Continuous Integration and Deployment, we use <a href=\"https:\/\/www.jenkins.io\/\">Jenkins<\/a> to run our pipelines. For artifacts management, we use <a href=\"https:\/\/jfrog.com\/artifactory\/\">Artifactory<\/a>, where we store built release candidates, libraries, and various other artifacts. Artifactory also serves as a Docker registry and a maven repository. Code collaboration is done using <a href=\"https:\/\/bitbucket.org\/\">Bitbucket<\/a>, and we use Jira as a bug\/issue tracking tool. We use&nbsp; <a href=\"https:\/\/www.vagrantup.com\/\">Vagrant<\/a> for managing some development environments and Docker for packaging most of our deployments.<\/p>\n\n\n\n<p>Teams are mostly using Feature Branching as git workflow although we also use trunk-based development and feature toggling to enable experimentation and combination of work-in-progress and completed features.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>DataScience: Machine Learning and Analytics<\/strong><\/h2>\n\n\n\n<p>Our products have various KPIs which we regularly monitor. KPI reports are mostly built on <a href=\"https:\/\/www.tableau.com\/\">Tableau<\/a> and <a href=\"https:\/\/zeppelin.apache.org\/\">Zeppelin<\/a>. We also use <a href=\"https:\/\/www.metabase.com\/\">Metabase<\/a> for various reporting. The analytics team built an anomaly detection tool called Sherlock which uses prediction models to check our most important KPIs.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"614\" src=\"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/pasted-image-0-1-1-1024x614.png\" alt=\"\" class=\"wp-image-1835\" srcset=\"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/pasted-image-0-1-1-1024x614.png 1024w, https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/pasted-image-0-1-1-300x180.png 300w, https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/pasted-image-0-1-1-768x461.png 768w, https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/pasted-image-0-1-1-1536x922.png 1536w, https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/pasted-image-0-1-1.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p class=\"has-text-align-center\"><em>Figure 4. Anomaly detection tool Sherlock finds anomaly during Thanksgiving day.<\/em><\/p>\n\n\n\n<p>Alerts trigger email and Slack notifications that are sent to all relevant people. DataScience teams use <a href=\"https:\/\/jupyter.org\/\">Jupyter<\/a> which is connected to our data platform. On top of our Hadoop cluster, we use Apache <a href=\"https:\/\/spark.apache.org\/\">Spark<\/a> and <a href=\"https:\/\/hive.apache.org\/\">Hive<\/a>.<br>We use various machine learning algorithms in our products, like <a href=\"https:\/\/lightgbm.readthedocs.io\/en\/latest\/#\">LightGBM<\/a> and <a href=\"https:\/\/xgboost.readthedocs.io\/en\/latest\/\">XGBoost<\/a>, and various unsupervised ML algorithms. Besides that, we also work on building our NLP (Natural Language Processing) solutions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Next steps<\/strong><\/h2>\n\n\n\n<p>Our tech stack is constantly evolving, some tools stop being used, new ones are added to the list. We will try to keep you posted on any new tool we found useful in building our products. This article is just a high-level overview or our stack and in the following articles, we will try to give more insights into these development areas, like Data, Infrastructure, Machine Learning, etc\u2026 In the meantime, if you would like to join our team and explore these technologies, go to <a href=\"https:\/\/bravosystems.com\/be-bravo\/\" target=\"_blank\" rel=\"noreferrer noopener\">&#8220;Be Bravo&#8221;<\/a> section and apply for open positions.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Historically, our teams were organized as separate products, each with its own technology stack, although the stacks were very similar for some teams. Now we are unifying our platforms, tools, and languages so that we can share knowledge and reuse services between teams in a better way.<\/p>\n","protected":false},"author":5,"featured_media":1822,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[71],"tags":[],"class_list":["post-1815","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Bravo Technology stack - Bravo Systems d.o.o.<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bravo Technology stack - Bravo Systems d.o.o.\" \/>\n<meta property=\"og:description\" content=\"Historically, our teams were organized as separate products, each with its own technology stack, although the stacks were very similar for some teams. Now we are unifying our platforms, tools, and languages so that we can share knowledge and reuse services between teams in a better way.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/\" \/>\n<meta property=\"og:site_name\" content=\"Bravo Systems d.o.o.\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/bravo.systems.doo\/\" \/>\n<meta property=\"article:published_time\" content=\"2020-08-14T09:36:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-09-22T10:51:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/9b2677c2997a-e1597151450201.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1620\" \/>\n\t<meta property=\"og:image:height\" content=\"700\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Dejan Cvijanovi\u0107\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Dejan Cvijanovi\u0107\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/\",\"url\":\"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/\",\"name\":\"Bravo Technology stack - Bravo Systems d.o.o.\",\"isPartOf\":{\"@id\":\"https:\/\/bravosystems.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/9b2677c2997a-e1597151450201.jpg\",\"datePublished\":\"2020-08-14T09:36:00+00:00\",\"dateModified\":\"2020-09-22T10:51:12+00:00\",\"author\":{\"@id\":\"https:\/\/bravosystems.com\/blog\/#\/schema\/person\/cc343657a06be68d846437cdca6bae2b\"},\"breadcrumb\":{\"@id\":\"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/#primaryimage\",\"url\":\"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/9b2677c2997a-e1597151450201.jpg\",\"contentUrl\":\"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/9b2677c2997a-e1597151450201.jpg\",\"width\":1620,\"height\":700},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/bravosystems.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bravo Technology stack\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/bravosystems.com\/blog\/#website\",\"url\":\"https:\/\/bravosystems.com\/blog\/\",\"name\":\"Bravo Systems d.o.o.\",\"description\":\"Blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/bravosystems.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/bravosystems.com\/blog\/#\/schema\/person\/cc343657a06be68d846437cdca6bae2b\",\"name\":\"Dejan Cvijanovi\u0107\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/bravosystems.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/Dejan-Cvijanovic.jpg\",\"contentUrl\":\"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/Dejan-Cvijanovic.jpg\",\"caption\":\"Dejan Cvijanovi\u0107\"},\"url\":\"https:\/\/bravosystems.com\/blog\/author\/dejan-cvijanovic\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Bravo Technology stack - Bravo Systems d.o.o.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/","og_locale":"en_US","og_type":"article","og_title":"Bravo Technology stack - Bravo Systems d.o.o.","og_description":"Historically, our teams were organized as separate products, each with its own technology stack, although the stacks were very similar for some teams. Now we are unifying our platforms, tools, and languages so that we can share knowledge and reuse services between teams in a better way.","og_url":"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/","og_site_name":"Bravo Systems d.o.o.","article_publisher":"https:\/\/www.facebook.com\/bravo.systems.doo\/","article_published_time":"2020-08-14T09:36:00+00:00","article_modified_time":"2020-09-22T10:51:12+00:00","og_image":[{"width":1620,"height":700,"url":"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/9b2677c2997a-e1597151450201.jpg","type":"image\/jpeg"}],"author":"Dejan Cvijanovi\u0107","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Dejan Cvijanovi\u0107","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/","url":"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/","name":"Bravo Technology stack - Bravo Systems d.o.o.","isPartOf":{"@id":"https:\/\/bravosystems.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/#primaryimage"},"image":{"@id":"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/#primaryimage"},"thumbnailUrl":"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/9b2677c2997a-e1597151450201.jpg","datePublished":"2020-08-14T09:36:00+00:00","dateModified":"2020-09-22T10:51:12+00:00","author":{"@id":"https:\/\/bravosystems.com\/blog\/#\/schema\/person\/cc343657a06be68d846437cdca6bae2b"},"breadcrumb":{"@id":"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/#primaryimage","url":"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/9b2677c2997a-e1597151450201.jpg","contentUrl":"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/9b2677c2997a-e1597151450201.jpg","width":1620,"height":700},{"@type":"BreadcrumbList","@id":"https:\/\/bravosystems.com\/blog\/bravo-technology-stack\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/bravosystems.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Bravo Technology stack"}]},{"@type":"WebSite","@id":"https:\/\/bravosystems.com\/blog\/#website","url":"https:\/\/bravosystems.com\/blog\/","name":"Bravo Systems d.o.o.","description":"Blog","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/bravosystems.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/bravosystems.com\/blog\/#\/schema\/person\/cc343657a06be68d846437cdca6bae2b","name":"Dejan Cvijanovi\u0107","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/bravosystems.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/Dejan-Cvijanovic.jpg","contentUrl":"https:\/\/bravosystems.com\/blog\/wp-content\/uploads\/2020\/08\/Dejan-Cvijanovic.jpg","caption":"Dejan Cvijanovi\u0107"},"url":"https:\/\/bravosystems.com\/blog\/author\/dejan-cvijanovic\/"}]}},"_links":{"self":[{"href":"https:\/\/bravosystems.com\/blog\/wp-json\/wp\/v2\/posts\/1815","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bravosystems.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bravosystems.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bravosystems.com\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/bravosystems.com\/blog\/wp-json\/wp\/v2\/comments?post=1815"}],"version-history":[{"count":16,"href":"https:\/\/bravosystems.com\/blog\/wp-json\/wp\/v2\/posts\/1815\/revisions"}],"predecessor-version":[{"id":1883,"href":"https:\/\/bravosystems.com\/blog\/wp-json\/wp\/v2\/posts\/1815\/revisions\/1883"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/bravosystems.com\/blog\/wp-json\/wp\/v2\/media\/1822"}],"wp:attachment":[{"href":"https:\/\/bravosystems.com\/blog\/wp-json\/wp\/v2\/media?parent=1815"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bravosystems.com\/blog\/wp-json\/wp\/v2\/categories?post=1815"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bravosystems.com\/blog\/wp-json\/wp\/v2\/tags?post=1815"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}