[00:00.000 --> 00:02.060] you [00:30.000 --> 00:58.320] Hello everyone this presentation is about tribe [00:58.960 --> 01:06.000] tribe is a collaborative project management framework it is collaborative as in it affects [01:06.000 --> 01:14.320] the ways in which people work together people from different teams UX design content and [01:14.320 --> 01:20.080] development it gives a set of conventions to work together kind of smoothens the collaborative [01:20.080 --> 01:26.800] process we call it a framework because it has a well-defined folder structure it has a set of [01:26.800 --> 01:31.760] conventions that are extendable and we are putting them out in the community so that we [01:31.760 --> 01:38.560] can together extend them further it has a defined text stack which is again extendable it has a [01:38.560 --> 01:44.240] set of licenses which enable open source collaborations and through this presentation [01:44.240 --> 01:50.960] we'll be taking you through all of these aspects to some extent I'll talk a bit about the hall of [01:50.960 --> 01:56.160] nations which has been used through this presentation as a metaphor it was a beautiful building [01:56.160 --> 02:03.520] an exhibition space in New Delhi built in 1972 it was built to house exhibitions the brief given [02:03.520 --> 02:09.440] to the architects was that it must be able to exhibit objects of varying sizes from books to [02:09.440 --> 02:16.880] satellites so the architects they came up with a design solution through the constraints of available [02:16.880 --> 02:23.280] building material available skill set cost constraints and all of that they broke convention [02:23.360 --> 02:30.480] by imagining a building without pillars also the building material for it was not prefabricated [02:30.480 --> 02:36.800] it was built on site coming back to tribe firstly I'll give a brief introduction about tribe [02:37.520 --> 02:43.440] tribe has been progressively built to provide one language or a unified set of conventions [02:43.440 --> 02:49.840] to the following three aspects relational database structure variable type handling in backend scripts [02:50.400 --> 02:57.120] and handling html input fields typically used in cms's to smoothen the data entry data editing [02:57.120 --> 03:04.240] and moderation processes within a project a bit of info about our team we're a team of four we [03:04.240 --> 03:10.800] run a small services company called postcode it was through our collaborations that tribe was [03:10.800 --> 03:18.080] progressively built over the last three years we've done around 90 projects we've worked with [03:18.080 --> 03:25.440] various external development teams ux folks design studios and content teams we have used [03:25.440 --> 03:32.560] tribe to build websites products applications android ios applications platforms and chatpots [03:34.960 --> 03:43.760] in terms of tech stack the core backend tech stack is php mysql we use nginx as a web server [03:44.320 --> 03:51.120] and composer packages whenever required based on projects tribe provides api support with json [03:51.120 --> 03:58.720] api version 1.1 to support any kind of frontend we typically use uh nodejs applications on the [03:58.720 --> 04:06.400] frontend before we delve deep into the technicalities of how tribe works i'd like to talk a bit [04:06.400 --> 04:13.360] about why did we create tribe we needed more backend agility to support iterations of ux [04:13.360 --> 04:18.880] content design and frontend decision making to work on how we build a more agile backend we [04:18.880 --> 04:25.280] needed to know the things that slow down backend development so we figured out constraints of [04:25.280 --> 04:31.120] database structure the rigid table structure does not allow us to constantly change the column names [04:31.120 --> 04:38.640] and table names we wanted to accommodate the agility that json provides while taking advantage [04:38.640 --> 04:45.600] of indexing and caching and searchability that mysql provides then while coding api layers [04:46.320 --> 04:51.920] we truly realize the importance of conventions looking at how json api has been drawn out really [04:51.920 --> 04:56.880] helped us think of more possibilities that could reduce time spent in backend development [04:57.760 --> 05:03.600] variable type handling in php takes up a lot of time and was not very agile in our experience [05:04.560 --> 05:10.240] in the collaborative process if for example we look from a content person's perspective [05:10.240 --> 05:15.600] it seems like a very simple ask when they say they need a multi-select instead of a single [05:15.600 --> 05:22.560] select such a simple ask can be a relatively complex task for a backend programmer especially [05:22.560 --> 05:29.520] if it is on a project that is live with significant user data also we wanted to date simple cms [05:29.520 --> 05:32.640] something that we could have across all our projects [05:35.200 --> 05:41.440] we wanted a single place to keep all our assets and uploads arranged by some convention so that [05:42.000 --> 05:46.240] things are predictably located and can be looked for at a later stage [05:49.200 --> 05:52.080] now let's go deeper in the architecture of tribe [05:53.040 --> 05:59.440] one of the core elements of tribe is a config file called types.json [06:00.800 --> 06:05.120] it is a pure json file that can be configured and reconfigured quickly [06:06.000 --> 06:10.080] it defines the information architecture of the application with precision [06:11.920 --> 06:13.600] and it looks somewhat like this [06:14.240 --> 06:22.880] and there are a few other terms that will help me explain types.json and its usage better [06:24.320 --> 06:31.440] the first term is types a type can be thought of as a data model or a table in a database [06:32.160 --> 06:38.960] it is non-hierarchical as it you cannot have subtypes all types are equal on the hierarchy [06:39.840 --> 06:48.000] it can accommodate metadata which is extendable a basic example would be a description of a type [06:48.800 --> 06:53.360] it's singular or plural form or how it would be called in a different language [06:53.360 --> 06:56.480] this is how a type looks within types.json file [07:01.360 --> 07:02.480] then there are modules [07:03.120 --> 07:08.800] modules are equivalent to columns in a table or attributes in a model [07:10.400 --> 07:15.360] they allow for complex relational references for example you could reference and link [07:16.400 --> 07:22.800] a module from one type to another module from another type or a module from one type could [07:22.800 --> 07:29.200] dynamically link to another type because types are non-hierarchical modules allow types to be [07:29.200 --> 07:35.600] referenced thereby creating a hierarchy if needed modules themselves are non-hierarchical so sub [07:35.600 --> 07:44.400] modules cannot be created a module also defines usage in input fields for CMS like types metadata [07:44.400 --> 07:52.480] of modules is extendable this is an example of how modules look there are there are four [07:52.480 --> 07:58.400] important aspects to notice here metadata starting with input underscore tells how the [07:58.400 --> 08:05.280] module must be used in an input field metadata starting with list underscore tells how the [08:05.280 --> 08:13.360] module must be listed in a list view metadata starting with var underscore defines how the [08:13.360 --> 08:22.080] module must be utilized by the php backend scripts input underscore slug can be used as name of the [08:22.080 --> 08:29.600] variable in php name of the input field in the front end and the name of the json attribute [08:29.600 --> 08:38.720] in mysql json thereby combining all of these use cases then there are objects an object is an [08:38.720 --> 08:47.040] instant instance of a model it is the equivalent of rows in a table it has a universal id that never [08:47.040 --> 08:53.120] repeats this is particularly unique to the way tribe functions this allows for objects to be [08:53.120 --> 08:59.520] shifted from one type to another even after the application goes live and at any stage an object [08:59.520 --> 09:06.720] is stored as a json object that retains the type and module structure in readable slugs rather than [09:06.720 --> 09:15.760] numbered references this is how an object looks like coming to uploads convention [09:16.560 --> 09:24.000] uploads folder follows a very simple convention year month day currently on tribe image file [09:24.000 --> 09:30.000] versions are created automatically junction is our content management front end system [09:31.440 --> 09:38.480] it is a headless cms it is a front end system built on ember js which is a node js based framework [09:39.280 --> 09:45.040] it also connects to the uploads folder the view you are seeing is the least view of a [09:45.040 --> 09:55.760] single type and this one is an editing view of a single object towards the end just reiterating [09:55.760 --> 10:04.080] our belief that convention is key to collaboration and word about licenses a tribe is in gpl version [10:04.080 --> 10:13.040] three junction which is the cms it uses the mit license and types dot json uses the creative [10:13.120 --> 10:21.520] commons license that's image called see raj reval associates the people who built the beautiful [10:21.520 --> 10:38.880] building a few shots of the building and that's it then thank you everyone [10:43.040 --> 10:44.420] you