
Welcome back to Decoding Love. It’s been a while, but we’re working on more content. Today is a special edition. So we will pause for a minute where we have sort of stayed. We will pause with basics. And today will be a special edition focused on data entry and how you can do this in a scalable, efficient way. And then, in one of the next editions, we will continue with the basics. I like your smile. So let’s get right to it. Let me pull up the example that I have prepared here. And actually zoom in and make this much, much bigger. Dina,(…) I also need you here. You recently approached me that you faced some issues with your data entry. So that you have certain things that you care about, but that you are not finding them in an easily accessible way. For example, you were talking about tasks that are spread across many Excel sheets.(…) But you might have also machines or big projects or just back office processes where you want to record some information about certain items.(…) And what I have prepared here for you today is something that can actually help you solve such topics rather easily. So let’s jump right in. We have a move us over into the corner and make this here big. What are we looking at here? Actually, let’s go to the other corner so you can see it better. Well, what we’re looking at here is something that is called a no code, low code database tool or backend as a server solution. Everyone of you probably has heard of Microsoft Office and some people know Microsoft Access for database. And a lot of people with an IT background are a bit scared of access because people build applications in there that are very hard to eventually transition to a more proper IT process or proper database. Imagine you had something like access,(…) but with the means of in the background interacting with a proper database and also giving you a proper machine readable API on the fly without any extra work. How would this be? Well, let’s just start here. So, Dina, I ask you now to just operate this. It’s actually the first time Dina is taking a look at this interface. So bear with us. It will be fun. And I will ask you to help me to join me here in building actually your new application from zero to hero in a couple of minutes.(…) So let’s get started. Please take the mouse and click create collection. So for starters, we will create collection.(…) Do you want to do something with tasks or do you have? I actually had one idea. Machines that we want to collect here. Machines. I had one idea. I don’t know whether it’s possible or whether it makes sense. But for example, if many people are working on one, I’d say Excel. Yeah, one idea. And if I create a version for myself, because it might be that I make the most amendments and then other colleagues are working on the other version where they just put their comments in our scheme, what we currently have. And then we get another version from some external with their comments. So they are scattered. Would this apply for that? Yeah, we can try this.(…) So let’s give it a name.(…) If you want to collect tasks, we will probably name these tasks.(…) Maybe it is nicer to give it lowercase letters, but both would work. Looks nice. And yeah, from a database perspective, like we still have some matter, but you will have an easier life later if you select this option here instead. Because of this particular task, particular application, or there is another reason I don’t need to understand it now. We need to understand it now. But basically, if you want to create a copy or backup clone of this data that is stored in the system, it’s much easier to just get the unique values instead of an incrementing value of the state of the increment stored in the database. But that is nothing we have to care about for today.(…) Anyways, so we can select a couple of fields which we may want to have. Let’s say, for example, a status field. We want to be able to sort this thing, and to store who created the task and when it was created, and if it was updated and who updated it, we serve the basics. Okay, so that’s quite boring. Let’s create our first collection. So what has happened behind the scenes, a table in the end of our database was created. In fact, the tool that we are using here is Directos, and it is a backend as a server solution, and it allows us to flexibly plug in any database from your self-hosted Postgres database or MySQL database or something else to a more cloud-native database. What we are currently using here is something that is running on my local computer, and I will explain later how you can run this also on your own. But for now, we want to focus on the use case of DINA of saving certain information. Okay, we have already a task. Well, we don’t know what this task is about.(…) So can you add a field so we can store information about, let’s say, maybe it’s task title and task description? What do you mean? Just click the create field button here. Do I need to amend something here? No, just click the create field button. Now we can create a new field. So perhaps you want to have a title about the task. So if a short summary of what the task is about. So we would just select the input box and say we need a new thing where we can store this. We could give it a short thing like summary or title. We don’t need to prefix it. You could just give it name, for example. What do you mean? You don’t need to write task underscore name. You could just write summary or just short description or name. Name.(…) That’s the same. Okay. Yeah, it’s the same. And we can say, ah, this is my L you must actually be set. And there’s no placeholder or anything. What do you mean it needs to be set? Well, it should not be empty. Okay. We always have to store name. And this is interesting because let’s say if you do this in an Excel sheet, you cannot set certain constraints, right? People are very flexible in what they can enter. And if you later want to work with this, it’s very tricky because it’s not super structured. Okay, let’s save this. We want to store a bit more.(…) Let’s say the description. If you want to store the description, what you can go for is, for example, a text editor, because you want to store the description. So let’s select an input. We are also inputting text. That’s right. It’s a good question. The difference is that in the text from input is just a plain text without any formatting or layout information.(…) If you here go for this, what you see is what you get editor. Let’s name this description. We get a proper, let’s say, text editor like a note from the word. And we say that must also be said it should not be empty. And let’s save this. And let’s briefly take a look at how this actually looks like. So if you go here on the side, we will see we have the tasks and that’s create a task. But now we are creating the task only with this description and the name. Yes, let’s start. So we can call this maybe test. Yeah, I have a full effect. Test. Yeah, I’m a bit nervous, right? Okay, fill in. Actually, let’s make this more nice. This one should be something big and something small as well. Cool. So let’s save this. For now, it’s status draft. And now we end up with this thing here. We can always come back to it. So my question is, do we want to store something in addition to these things? What do you commonly need to also store? Sometimes you need a link. Linked to another task. No, I mean link in the description maybe to easily find it afterwards that you don’t need to search. But you have already a link to your document, for example. Okay, yeah, this is something we can do. So let’s go back to our data model, to the task and change this. Let’s add a new link here. Can you say create field? But it’s the same thing we did before, yeah? Okay. It’s the same thing we did before, exactly. So we have different types of fields. We have, for example, the possibility to search for tags.(…) We can have other things like a date, for example. You can enter a specific color, that’s a due date of the task. Maybe we need this as well. You can even have checkboxes. You can have a dropdown.(…) And we can infer also, let’s say if you have tasks, you want a reference to a parent task. You can also create something like this. So you can connect one task with another task. Say, first of all, I have to finish task one. Then we can finish task two. I think we need all of this, what we just said. And then there is also the possibility to have some, I guess, file upload. You can say, I want to directly upload a document, for example. It would be actually stored with this system.(…) But you can say, it’s already hopefully not just an outlook in an email, but somewhere else. And instead of uploading it here,(…) we could just basically make another text input and say, this is the file path. For simplicity, we may for now assume this is the file path. This is okay for you. How do you prefer to upload it? Yeah, file path is good. But I wouldn’t put it on required, because sometimes you have a symbol you don’t have. That’s totally fine. You can even give it a cool icon, but for now, let’s just skip that. Okay, we have a file path now. And we said we want to have a due date. So here, let’s select a due date. And we say this must be set. Can’t be empty. Is that okay? Or sometimes we don’t know. Sometimes we don’t necessarily have a deadline, you know. Okay. So let’s skip this. And yeah, actually, the format that we need is just a short form. And we don’t need seconds or something in too much detail. Let’s also add this due date. And now we also want to have this parent. So it’s not called relation. But here we have groups maybe. Yes, we have it here. Some of them have relationship that we can say one task can depend on. Many things can depend on a single one or with the versa. Many to many or one to many. So let’s just test this out so you see the difference. One to many. We say one task can have many children, for example. Or many tasks can have one parent. But it’s the same thing, actually. No, but it’s opposite. So let’s choose with parent. It’s empty default value. But the parent value that you want to have, you have to select it. And here we want to tell it, “Ah, we want to get this from tasks.” And the name should be what we see actually with the name. So we can see them. You will understand in a minute what I mean. Let’s save this.(…) So we have added a couple of things. Let’s add a second task. Again, let’s keep it in draft. Let’s say this is task two. Content two.(…) We have a file path. It is testpath.xless.x using new axle, not on SharePoint. And new date will be whenever,(…) this time. Or maybe let’s set to no. That’s always cool. It’s usually task or date, right? It should have been done yesterday. A bit too fast. So set to no. And then here we have a parent. Let’s select a parent now. And as you can see, here we can select what issue is the parent. We can in fact reference ourselves, which is maybe not necessarily what we want. In principle, we can add some more constraints. So that this is not possible to select ourselves here. But for starters, for this quick introduction, this doesn’t matter so much. And let’s say issue one is the parent. And let’s complete this. So here we will not see anything change. In fact, we could add some more data. And here we have stored this new data and we know that the parent is test now. And the things that might get interesting is that we could potentially generate dashboards or visualizations from these items that we have collected. That would be nice to have like one that is due date is very near, one that due date is already over. You could create whatever you want. Actually, I’m not an expert here with the dashboards. I have to check this out myself, but you can basically add some panels and say, I want to have a bar chart or let’s say line chart of open task or closed task or list of tasks that are older than something. And you can then basically pull in the collection. For now, I will just pull it in quite simple.(…) Yeah, we should get a list here, for example. Obviously, it looks like you have to configure them a little bit more detail, because it should not be empty. But I guess you understand the point. Like this is a quite flexible system that allows you to quickly structure the data in a way that is machine readable. It is stored in a database so you can easily integrate it into some IT processes. And in fact, because it has its own machine readable API, REST API, GraphQL API, you can directly make IT systems talk to the data that you have collected here. And unlike Excel sheets that are rather flexible and fluffy sometimes, people just fill in something on the column in the different cell, not the one you would expect the content. This is when causing problems when you want to read the data in a machine. Here, it is nicely structured in a database. In our case, it’s Postgres and everything has their own row and column, and it’s just easily to consume. But still, I cannot sync it with my Excel sheet where my tasks. No. And then sync it with another one and it feeds in like, no, right? I mean, I say no because it’s not easily. What you obviously could do is you can configure certain triggers. So if we go back to the edit, if you’re here, you can somewhere. Let’s say your parent changes. What you can then do is you can set. First of all, you can hear, add, for example, additional validation so that you cannot select yourself. But what you cannot select yourself? What do you mean? Currently, we can select ourselves as the parent of ourselves. Maybe we don’t want to do this. You may only want to select. The parent or what? Yes. Now we can self-reference us. So we can. Where self-references? So here we can say the parent is actually. I clicked the wrong thing. I want to select the parent and not just edit it here. So we can select ourselves here. Maybe we don’t want to see us in the list, but only the other items. This is what I meant with validation. You can filter these things out. So you have removed. They’re not part of the list. So that means people can only select valid values. Values that you would like to see there in this list. What do you mean with valid values? If I have insert and filled everything out and it’s valid, basically for this system. Let’s take one step back here. So assuming you would have an additional column that is called. It has a dropdown. And has some some category. Let’s call it category. And the choice might be. A task for marketing. And we have maybe a different additional category for the technology. When we can. Let me save this and go back. So now when we added this,(…) we can select the category. This is a marketing task and safe. But what I mean here, when we in issue one and we want to select the parent. We can select ourselves as a parent. So we can self reference as in create a loop.(…) And potentially this is something we don’t want people to do. And with the validation. Extra details that we in principle could set up here. We could actually. Say parents doesn’t equal. I don’t know if it is.(…) If it’s possible to do you mean with self. I don’t know. I would have to look up a syntax to be precisely. But basically if you remove ourselves from this list. But what do you mean with ourselves? What I mean with ourselves is that if I jump over and open this in a second window. Currently. This list includes two tasks. But maybe we only want to be able to select. This can be our parent, but not we can be the parent. You cannot be the parent of a parent directly. Like to say whether this task is the parent or the child. No, but basically. If you have a parent. You cannot be the parent of yourself. You can only be the parent of someone else. And then we could potentially bring this logic directly into this filter. Here I would have to look up. Not to you not to choose the same task that is apparent.(…) I don’t see it like that. Yeah. It’s always a bit tricky to find right words, but I think it’s a good exercise. To learn how end users think for it. No, it’s like myself. Yeah. But this is one example. Is there a second case that you would like to build to better understand this? Or are you already good?(…) So can you understand the power in tools like this? Yes, but then I would want to work straight with this because then it doesn’t matter to to reinsert everything in another device that is maybe better organized. But then it makes sense only to insert it straight away here and not to like gather information from different programs. Then you need to insert here straight away and that, you know, yeah. So this doesn’t help a chaos that people are used to work with. This you just need to straight away to work with this. So so I would agree with you. Like I personally think it makes sense to properly use excellent SharePoint in the first place and then not even have this problem. But there are many issues where they are not, let’s say, excellent only, but there you have machines made want to track who is currently renting or using the machine or some back office tasks that you have to do. Yeah, some managed certain bills, for example, or any process where you have to collect some information and just keep track of it over time. And for all of these things, a solution like this could be rather helpful. And the interesting thing is in one of the projects working, using this at hub. there we have a data class every collect information about data sets that we are working with. And on the admin interface or internal part of the application, people actually use something like this here that we just have discussed. Obviously, it has different fields that are more sensible for storing metadata about data and a little bit of sample data. But the interesting thing is because the directors is exposing a machine readable API, we can easily integrate the data of directors into a very nice front end. do what? Because then you need to type in everything by hand. So what you need to type by hand is you need to collect the data.(…) But once you have collected the data. Can’t you feed it in with Excel, for example? Possibly.(…) You can feed in the data also directly to the database. There are many possibilities, but the assumption is that you don’t have the data in a structured format and you want to collect it. For example, in the list here. And then you want to do something with it. And what I want to show you is that it’s so easy to connect the APIs to something more custom. So here we have created a custom graph visualization viewer. You can select specific topics that you might be interested in, be it complex systems or human regression or whatever. And you can filter this graph and see, ah, this is an interesting topic. And then you can see what are the offers or data sets that are connected to these particular topics. this, you can easily repurpose the data that you have collected and give it in a different new way to end users. you don’t have a structure and you want to collect information in a structured way, because currently you might be using an Excel sheet where people are always filling out the wrong columns and you just have a mess using a solution that you have a proper database, a very strict structure. But in the end allows you to do something with it with collected data. So you can work with this data in a machine readable way and repurpose it easily or automate processes based on the data that you have collected.(…) Now your question was given, I already have a lot of structured data. What can I do with it? And then how can it perhaps combine it with something like this? So there are two interfaces to local, local database tools like directors here. First of all, you can directly write to the database if you know what you’re doing. Secondly, and that would be more recommended, it has a machine readable API. So instead of reading the data that we have collected there manually, you could instead write to the database using the API. So you would send some create request as an IT web service. And then basically your data would be transferred from one structured representation to the other one. But this is not really what I want to focus on the field today. Rather on showing you how easy it is to keep track of things in a structured way that doesn’t involve the inconsistencies that actually inevitably will make a reality for a lot of people. how can you run something like this in the show notes of today’s call, you will find details.(…) Basically what we have been doing, we have used a containerization technology. We will touch in a couple of weeks again on what is this actually and how does it work for now. Just assume it’s something that makes things smooth like real containers. You can stuff whatever you want.(…) And they always have the same proportion. So it’s easy to handle them here. The stuffing software and you can just simply start the whole solution by running this command. What happens in the background, couple of containers are started, something for the backend, something for the front and something for the database. And that gives us this nice service that we’re looking at here. We had some extra possibilities that you might be interested in using. For example, using a full text text search option or a vector search option. But that is sort of too much to go into detail now. It’s a possibility to even easily construct a backup. Here’s some example code of how this might look like. And there are also other possibilities. So other similar each solutions is something like Airtable, Base Row or NOCODB.(…) I personally really like this solution directors because it’s super flexible for permission handling and allows so many other possibilities with regards to uploading larger files. Sending events based on changes and it’s quite a cool solution. But you may be interested in exploring these three options just as well. Then there are other options that are slightly different like Superbase for example. It is a bit of a different user group. It’s more like a managed traditional database with some extra features. Not so much with NOCODB solution like these here. There are specialized options available. So if you’re looking to use spatial data a lot and you might want to track machines or if you’re a city council and you want to track things that are broken or waste in the city. Exploring something like Qfield could be a really good option for you. And last but not least, there are also other options for managing NOCODB apps like Bodybase or Retool that gives you something that has a more fully fledged production grade view of an application like a proper application. But it’s much much more effort to build an application there compared to these simple list based applications. When you want to deploy this, there are a couple of ideas how you can do this but this would be too much detail for the start here. I think the main takeaways. It’s super easy to construct a custom data model to store data that is not structured in Excel in such a NOCODB database solution. It behaves almost like access. But if you ever want to integrate it into IT processes like the example that we have shown here, it is actually easily possible to do that. Does it have any constraints that it works with this kind of solution but not with this program? Can you detail this? What do you mean with constraints? The directors can work with, for example, this program that you have. Can you click on it? Complexly it signs up. For example, I don’t know which program does these interlinks. This is not any special program. What I mean is we have stored the data in a machine readable way. After storing the data in a machine readable way, you can access it with any tool. You have standardized interfaces to pull the data out in a machine readable way. What we have done here with this custom visualization,(…) using some JavaScript and consuming the rest APIs of directors and pull the data out that we need. But you just as well might have another IT background process or a custom front that some of your developers have designed that is custom-tailed for a specific use case. But collect data in a structured way with some guardrails in place. In fact, guardrails that are missing or impossible on the Excel side. I hope it can help you in your actual work, maybe. You’re discussing about how you want to keep track of things with a particular topic of tasks. Maybe a proper issue tracker like Jira might be a more finished product. But in any case, instead of not tracking things or just in Excel, having a database backing what you’re doing can be highly beneficial because you’re more structured. And whenever you want to work with some automation, it is easily possible.