In this tutorial, you will explore the Semarchy Data Platform Extension — a Visual Studio Code integration that enables you to design, build, and deploy Semarchy Data Products directly from your local environment.
Through a guided, hands-on exercise, you will learn how to create and configure a complete Employee Data Product, discovering how the extension supports every stage of model design — from defining entities, attributes, and relationships to implementing enrichers, validations, match rules, and survivorship strategies.
By the end of this tutorial, you will understand how a logical data model and an MDM web application are assembled within a Data Product, and how the complete Data Product is validated, built, and deployed.
Before starting, make sure you have:
Additional setup information can also be found in the official documentation: Set up your design environment
Please, click on the link below to download the required resources, including the images and datasets used within this tutorial.
Download the tutorial resources
All steps are designed to be self-contained, guiding you through the process even if you have limited prior experience with Semarchy Data Platform.
The Employee Logical Model represents a simplified but realistic master data domain centered around employees and departments within an organization.
It helps you experience how to manage fuzzy-matched entities, relationships, and hierarchies in practice.
The model contains two core entities:
In addition, the model includes:
Imagine a multinational company consolidating employee data coming from several systems:
Each of these systems may contain overlapping or conflicting records — for example, the same person entered twice with slightly different spellings or formatting ("Jon Smith" vs. "John Smith").
Using the Employee Logical Model, you will learn how to:
By the end of the labs, you will have built a fully functional Employee Data Product, capable of:
This practical exercise will help you not only learn how to model, but also think like an MDM designer — structuring data for real-world enterprise use cases.
In this first chapter, you'll install the Semarchy Data Platform Extension and set up the VS Code workspace that represents your data project. In SDP the workspace is the top-level organizational unit and can contain one or more Data Product packages.
This workspace will be the starting point for all the Data Product design work you'll do in the next chapters.
You can skip this task if the extension is already installed in your VS Code.


You will create a Data Product package folder named employee-training-project. A Data Product package is the organizational unit that contains the structure, design files, and supporting resources required to build and deploy one Data Product.



Let's take a look at the result. Your Explorer view should now look like this:

In the bottom-right corner, you may see the message: "Configuration is configured correctly".

At this point, you have created the data project and initialized its first Data Product package. The next step is to initialize the Employee Data Product under the package's src folder.
In this chapter, you will initialize the Employee Data Product. Its Data Product folder will contain the logical data model, certification rules, application definitions, and the Data Product profile used for technical configuration.
You will use the workspace set up in the previous chapter.



Observe what folders have been created automatically under the Employee folder.

Expand the applications folder and open the file DefaultApplication.Application.seml
. This file was automatically generated when you created the Data Product.

Update the Label and applicationTitle properties — this will be the name of your application in the Data Platform. Then, save your changes and close the file.
label: Employee Application
applicationTitle: Employee Application
Before you start creating entities, it's essential to understand the SDP Data Product structure and the role of its required profile.
Each Data Product includes key design files that define its technical configuration and security.
Here, you'll look at two of them — Employee.DataProductProfile.seml (the Data Product profile) and semarchyAdmin.DataProductPrivGrant.seml (the access permissions).

The Data Product profile defines the technical environment used by the Data Product and provides configuration settings required by other design objects.
Every Data Product requires exactly one Data Product profile, stored at the root of the Data Product folder.
When you later build or deploy the Data Product, the extension uses this profile to:
💡Tip: Customizing the Data Product Header
At this stage, you can already enrich the header with a short description.
This does not affect deployment or runtime behavior, but it helps document the purpose of the Data Product directly in the code. For example:
_type: DataProductProfile
_package: Employee
_name: Employee
label: Employee
description: "A Data Product consolidating employee and department data from multiple business systems (HR, ATS, Payroll)."
modelConfiguration:
type: POSTGRESQL
Adding a description makes the Data Product easier to understand when browsing the project or collaborating with others, especially in environments with multiple Data Products. You'll revisit this metadata later in the Build and Deploy phase, where its real impact becomes visible.

You'll address these in the next chapters as the Data Product takes shape.

This file defines who has access to the Data Product and what they are allowed to do once it's deployed to the Semarchy Data Platform.
The default file, semarchyAdmin.DataProductPrivGrant.seml, is created automatically and grants full privileges to the Semarchy Administrator account.
This ensures that once your Data Product is deployed, the system administrator can access it without restrictions.
You'll explore these aspects later in the course.
In this section, you'll create your first business entity — Department.
This entity will store the list of departments within the company and later serve as a reference for the Employee entity.




The extension automatically generates a complete folder structure for your new entity, including design files for attributes, enrichers, validations, and more.

Let's configure some attributes of the Department entity. Here is the description of them:
Attribute | Datatype | Mandatory | Notes |
DepartmentID | String (20) | Yes | ID is set manually |
DepartmentName | String (128) | Yes | Name of the department |
DepartmentDescription | String (4000) | No | Description of this department |
Every new entity starts with a single default attribute, typically named after the entity (for example, DepartmentID), and defined as a LongInteger.

Let's adjust it to follow the desired format.
DepartmentID).LongInteger to String.20.precision property (if present).SourceIDGeneration, change the mode to MANUAL.Your ID will now be manually defined, giving you full control over how departments are identified.
attributes:
- _type: EntityAttribute
_name: DepartmentID
label: Department ID
physicalName: DEPARTMENT_ID
dataType: String
length: 20
mandatory: true
searchable: true
sourceIdGeneration:
mode: MANUAL
primaryKey: Employee.entities.Department.Department.DepartmentID

- _type: — VS Code will suggest the attribute type EntityAttribute.Property | Value |
_name | DepartmentName |
label | Department Name |
physicalName | DEPARTMENT_NAME |
dataType | String |
length | 128 |
mandatory | true |
searchable | true |
mandatoryValidationScope | PRE_CONSO |
Your entity now has two attributes:
DepartmentID — a manually set identifier,DepartmentName — the department's business name.You can collapse each attribute section by clicking the arrow next to its _type for easier navigation in the editor.

- _type: — VS Code will suggest the attribute type EntityAttribute.Property | Value |
_name | DepartmentDescription |
label | Department Description |
physicalName | DEPARTMENT_DESCRIPTION |
dataType | String |
length | 4000 |
mandatory | false |
searchable | true |

You've successfully created and configured your first entity — Department. Don't forget to save the file.
Although DepartmentID already uniquely identifies each department as its primary key, nothing yet prevents two departments from being created with the same DepartmentName. A unique key lets you enforce that additional constraint.
unique_keys.unique_keys folder and run Set up and manage a data model -> Semarchy: Create Unique Key.
DepartmentNameUniqueKey._name: DepartmentNameUniqueKey
_type: UniqueKey
_package: Employee.entities.Department.unique_keys
entity: Employee.entities.Department.Department
label: "Department Name Unique Key"
keyAttributes:
- attribute: Employee.entities.Department.Department.DepartmentName
validationLabel: "A department with this name already exists."
validationScope: PRE_CONSO
What this does: keyAttributes lists the attributes that together must be unique for every Department record — here, just DepartmentName. validationScope - PRE_CONSO - checks the constraint before consolidation, on incoming records.
Save and close the file.
Let's start with a small LOV for employee titles.


label : Salutations; length: 8lovValues:Code | Label |
Dr | Dr |
Mr | Mr |
Mrs | Mrs |
Miss | Miss |

2. Creating the "Subsidiaries" LOV
Here, you'll create a second LOV representing the organization's subsidiaries.
Repeat the same steps:
list_of_values;Subsidiaries;Code | Label |
ACME_APAC | ACME_APAC |
ACME_EU | ACME_EU |
ACME_US | ACME_US |
Your LOV file should look like:
_package: Employee.list_of_values
_name: Subsidiaries
_type: LOVType
label: Subsidiaries
length: 16
lovValues:
- label: ACME_APAC
code: ACME_APAC
- label: ACME_EU
code: ACME_EU
- label: ACME_US
code: ACME_US
3. Validating Your Work
Once you save both LOV files:

In this section, you'll create your core business entity: Employee.
Unlike the Department entity you built earlier, Employee will be a Fuzzy-Matched Entity, meaning that DM will automatically detect duplicates and consolidate them into golden records.
You will also:
Let's create the Employee Entity.
You now have an empty Employee entity ready to be populated with attributes and rules.
Expand the Employee folder. You'll see a set of default subfolders similar to the Department entity (attributes, validations, enrichers, steppers, and so on), which will be filled as you progress through later chapters.

Open the file Employee.Entity.seml. Let's observe the key default properties of a Fuzzy-Matched Entity and how they differ from a Basic Entity like Department.

Before adding business attributes, you will first adjust the default configuration of the Fuzzy-Matched Employee entity.
The goal is to align your entity with recommended MDM settings and ensure it behaves correctly within the mastering process.
description: ""
documentation: ""
The property description is intended for short, functional notes about the entity. The property documentation can include larger, technical or business explanations.
For now, leave them blank. You will fill them in later if needed, once your model is complete. It's a good practice to keep these fields present even if temporarily empty.
SEQUENCE starting at 1, which ensures that each golden record receives a unique and automatically incremented identifier. No change is required here — simply verify the configuration and leave it as it is: goldenIdGeneration:
mode: SEQUENCE
startWith: 1
sourceIdGeneration:
mode: MANUAL
historizeGolden: true
historizeMaster: true
dataEntryAllowed: true
After updating the default properties, your Employee.Entity.seml file should match the sample configuration below with proper metadata, ID generation settings, history tracking, etc.

Your Employee entity is now ready for the next chapter, where you will add all business-relevant attributes.
At this stage, only one attribute: a default primary key (EmployeeID) is present.
- _type: EntityAttribute
_name: EmployeeID
physicalName: EMPLOYEE_ID
dataType: LongInteger
label: Employee ID
mandatory: true
precision: 38
searchable: true
Attribute | Datatype | Mandatory | Notes |
EmployeeID | LongInteger | Yes | ID is set manually |
FirstName | String (128) | Yes | |
LastName | String (128) | Yes | |
HireDate | Date | Yes | The date the employee was hired |
Subsidiary | List of values | Yes | Uses Subsidiaries LOV |
Salutation | List of values | No | Uses Salutations LOV |
Title | String(128) | No | Job title |
String(500) | No | ||
IsContractor | Boolean | No | Optional flag |
Picture | Binary | No | Will hold the employee picture |
EndDate | Date | No | End of employment |
Phone | String(128) | No |
Here is the recommended SEML structure for several key attributes:
# First Name
- _name: FirstName
_type: EntityAttribute
label: First Name
physicalName: FIRST_NAME
dataType: String
length: 128
mandatory: true
mandatoryValidationScope: PRE_CONSO
searchable: true
# Last Name
- _name: LastName
_type: EntityAttribute
label: Last Name
physicalName: LAST_NAME
dataType: String
length: 128
mandatory: true
mandatoryValidationScope: PRE_CONSO
searchable: true
# Salutation (LOV)
- _name: Salutation
_type: EntityAttribute
label: Salutation
physicalName: SALUTATION
dataType: Employee.list_of_values.Salutations
lovValidationScope: PRE_CONSO
mandatory: false
# Subsidiary (LOV)
- _name: Subsidiary
_type: EntityAttribute
label: Subsidiary
physicalName: SUBSIDIARY
dataType: Employee.list_of_values.Subsidiaries
lovValidationScope: PRE_CONSO
mandatory: true
mandatoryValidationScope: PRE_CONSO
Continue adding the remaining attributes:
# Title
- _name: Title
_type: EntityAttribute
label: Title
physicalName: TITLE
dataType: String
length: 128
mandatory: false
# Hire Date
- _name: HireDate
_type: EntityAttribute
label: Hire Date
physicalName: HIRE_DATE
dataType: Date
mandatory: true
mandatoryValidationScope: PRE_CONSO
# End Date
- _name: EndDate
_type: EntityAttribute
label: End Date
physicalName: END_DATE
dataType: Date
mandatory: false
# Contractor Flag
- _name: IsContractor
_type: EntityAttribute
label: Is Contractor
physicalName: IS_CONTRACTOR
dataType: Boolean
mandatory: false
# Email
- _name: Email
_type: EntityAttribute
label: Email
physicalName: EMAIL
dataType: String
length: 500
mandatory: false
# Phone
- _name: Phone
_type: EntityAttribute
label: Phone
physicalName: PHONE
dataType: String
length: 128
mandatory: false
# Picture
- _name: Picture
_type: EntityAttribute
label: Picture
physicalName: PICTURE
dataType: Binary
mandatory: false
Now you'll create the relationship that connects each employee to exactly one department.



label: Employee Belongs To Department
description: Reference indicating that an Employee belongs to a Department.
deletePropagation: RESTRICT
oneToMany: false
fromEntity: Employee.entities.Employee.Employee
fromRoleLabel: Employees
fromRoleName: Employees
fromRolePluralLabel: Employees
physicalName: EMPLOYEE_DEPARTMENT
toEntity: Employee.entities.Department.Department
toRoleLabel: Department
toRoleName: Department
toRolePhysicalName: DEPARTMENT
validationScope: PRE_CONSO
foreignAttribute:
_type: ForeignAttribute
_name: Department
label: Department
physicalName: DEPARTMENT
searchable: true
entity: Employee.entities.Department.Department
Now your reference file should look like this:


Result
Your Employee entity is now fully defined and structurally complete, with:
This entity will serve as the foundation for enrichment, validation, matching, and survivorship logic in the chapters that follow.
In this chapter, you will standardize employee names and prepare them for fuzzy matching. You will clean and properly format both FirstName and LastName. These transformed attributes will later be used in your match rules.
You will now create one SemQL enricher that cleans both names:


label: Normalize first and last names
description: >
Remove punctuation and extra spaces, then set the first letter upper case and the rest lower case for FirstName and LastName.
entity: Employee.entities.Employee.Employee
enricherExecutionScope: PRE_CONSO
semQlEnricherExpressions:
- attributeName: FirstName
expression: INITCAP(
REGEXP_REPLACE(
LOWER(LTRIM(RTRIM(FirstName))),
'[[:punct:]]',
' ',
'g'
)
)
- attributeName: LastName
expression: INITCAP(
REGEXP_REPLACE(
LOWER(LTRIM(RTRIM(LastName))),
'[[:punct:]]',
' ',
'g'
)
)
What this does:



Result
You now have clean, consistently formatted versions of FirstName and LastName.
These attributes provide robust inputs for the match rules you'll configure later to detect potential duplicate employees.
Data validation rules ensure that incorrect or incomplete data cannot be entered or imported into the hub. Some checks are built in—like mandatory fields or list-of-values restrictions—while others must be defined explicitly, such as SemQL validation rules and match rules.
In this section, you will discover how to use SemQL for data validation, in order to ensure data consistency.
You will create a rule to ensure that an employee's last name is of sufficient length.

Employee.entities.Employee.Employee
label: Check Employee Last Name Length
condition: length(LastName) > 1
validationScope: PRE_CONSO
What this does:
LastName. If the count is greater than 1 then the condition is true, the validation is passed. Otherwise the condition resolves to false, resulting in the rejection of the invalid record.In this section, you will configure the match rules that will apply to your application. You will learn:
In Semarchy DM, matching is performed on master records coming from source systems. It is a fundamental step of the certification process that aims at consolidating these master records into unique golden records.
In the case of fuzzy-matching entities, such as the Employee entity, master and golden records use different identifiers:
Match rules define how incoming source records match together. You have full control of the rule details and the thresholds defining when matched records should merge and when merged records should be confirmed.

Once master records have been matched, survivorship rules define how their attributes will consolidate into the resulting golden record
To enhance the matching process, you will implement multiple match rules and assign confidence scores.
You are now going to add a match rule that will leverage the enriched names you added previously.
Add a match rule for standardized Employee names
matchRules:
- _name: ExactNameAndSameSubsidiary
_type: SemQLMatchRule
condition:
Record1.FirstName = Record2.FirstName
AND
Record1.LastName = Record2.LastName
AND
Record1.Salutation = Record2.Salutation
AND
Record1.Subsidiary = Record2.Subsidiary
label: Match On Name And Same Subsidiary
matchScore: 100
usingMatchOn: false

What this does:
Add a second match rule for Email
You are now going to add a second match rule. By defining multiple match rules, the matching can be improved. This rule will enhance matching by including email and then assigning a distinct confidence score
- _name: ExactNameAndSameEmail
_type: SemQLMatchRule
condition:
Record1.FirstName = Record2.FirstName
AND
Record1.LastName = Record2.LastName
AND
Record1.Email = Record2.Email
label: Match On Name And Same Email
matchScore: 90
usingMatchOn: false

What this does:
In the same Employee Entity file scroll down to the matcher section. With your two match rules, a confidence score of 100 means an exact match on name and subsidiary, and 90 means a match on name and email alone.
By default, Semarchy already configures the policy so the high-confidence matches merge and confirm automatically, while the lower-confidence email matches still merge but wait for a data steward to confirm. Without changing anything, your matcher section already includes the following:
mergeThresholdRemergingPreviouslySplit: 100
autoConfirmGoldenThreshold: 99
What this does: with every mergeThreshold property still at 0 except mergeThresholdRemergingPreviouslySplit, any matching records merge automatically. autoConfirmGoldenThreshold: 99 means only match groups scoring 99 or higher — the exact matches found by ExactNameAndSameSubsidiary (score 100) — are confirmed automatically.
Groups matched only by the lower-confidence ExactNameAndSameEmail rule (score 90) still merge, but remain unconfirmed match suggestions for a data steward to review. mergeThresholdRemergingPreviouslySplit: 100 means a golden record group a steward has previously split only re-merges with the steward's involvement, not automatically.
Publishers are applications that provide source data to the Data Hub. They are commonly used in survivorship rules, but can also be used in match rules or enrichers.
In this section, you will define three publishers: one for each source system that will supply data:
Payroll, ATS, HR

_package: Employee.publishers
_name: Payroll
_type: Publisher
code: PAY
label: Payroll
active: true

Survivorship rules determine the best value for the golden record from multiple source records that match and merge. A default rule was created automatically with the entity.
You will edit this rule to define the level of trust you place in each of your publishers. This strategy involves manually prioritizing publishers and is widely used, particularly for fields where one source system serves as the system of record for that item.

CUSTOM_RANKING to PREFERRED_PUBLISHER to select and order your publishers manually.publisherRankings in this order:by setting _type to ConsoPublisherRanking and assigning the publisher
publisherRankings:
- _type: ConsoPublisherRanking
publisher: Employee.publishers.HR
- _type: ConsoPublisherRanking
publisher: Employee.publishers.Payroll
- _type: ConsoPublisherRanking
publisher: Employee.publishers.ATS
consolidationOrderByExpression: UpdateDate DESC
In this chapter you will learn how attribute values are consolidated and how to allow, or prevent, user-entered values from overriding the consolidated value.
We will continue editing the DefaultRule.StandardSurvivorshipRule.seml file.
In the Employee application, the HR team is responsible for all the attributes. Data stewards are allowed to override them. However, if the HR team provides an updated value, their input should take precedence once again. Hence, you will employ the Override - until consolidated value changes strategy.
overrideStrategy: UNTIL_CONSOLIDATED_VAL_CHANGE

For the hire date attribute, you'll implement a rule that takes the earliest date from the source records.

label: Hire Date Rule
defaultRule: false
consolidationSkipNulls: false
consolidationStrategy: SMALLEST_VALUE
overrideStrategy: NO_OVERRIDE

attributes and choose the appropriate attribute value:attributes:
- attributeName: HireDate

In this chapter, you will generate the Application Components for both the Department and Employee entities.
These components define how your data appears in the Semarchy Data Platform application:
Once created, you'll be able to navigate and edit your Employee and Department data through a complete, ready-to-use application UI.

You should now see subfolders like:
Each of these will contain a .seml file pre-populated with default properties.

Let's briefly explore what has been created.
Look at EmployeeActionSet.ActionSet.seml. You'll see actions such as:
Open EmployeeActionSet.ActionSet.seml. Scroll down to the property ImportAction. Change the importedRecordType from GOLDEN to MASTER:
_type: ImportAction
_name: ImportAuthorEmployees
label: Import
useCustomLabel: true
waitDialogEnabled: false
importedRecordType: MASTER
importMode: CREATE_AND_UPDATE
allowOtherPublishers: true
stepper: Employee.entities.Employee.steppers.AuthorEmployees
This will enable the import of master records instead of golden records. The other actions can be customized later, but their defaults are sufficient for now.
Open EmployeeBusinessView.BusinessView.seml. Check the label property. If the extension didn't generate one automatically, add:
label: Employee
This name will appear in the application's left navigation menu.
You may see the warning "A display card is recommended":

If it happens, add:
displayCard: Employee.entities.Employee.display_cards.EmployeeDisplayCard
Save and close the file.
Open EmployeeCollectionView.CollectionView.seml. All attributes are visible by default, including technical ones.
These columns can be customized or hidden later.
Open EmployeeDisplayCard.DisplayCard.seml. By default, the generated card shows:

You can later customize this card to show a more user-friendly identifier, such as FirstName + LastName, or display the employee's real picture.
Open: EmployeeForm.Form.seml. The default form includes all entity attributes in a simple layout.
Later, you can group fields, reorder them, or hide technical fields.
Open AuthorEmployees.Stepper.seml. For now, the default stepper contains a single step.
You'll enhance this later if your application requires structured workflows.
Semarchy generated ManageDuplicatesOnEmployee.DupsManager.seml for you, already wired to the Employee display card, form, and collection view you just reviewed. Duplicate managers are only generated for fuzzy-matched entities, which is why Department — a Basic Entity — has no duplicate manager.
Repeat the same steps for Department.Entity.seml:
These components, as for the Employee entity, support browsing, editing, and managing departments within the application.
Once both entities have their components:

If both folders are present and contain the expected SEML files, it means your model has no missing essentials and you can proceed confidently to the Build & Deploy chapter.
Result
You now have a complete set of UI components automatically generated for your model.
These components define how users will browse, view, and edit data in your Employee application.
In the next chapter, you will build and deploy your Data Product, and then open your first version of the Employee application in the Semarchy Data Platform.
First, configure the Semarchy Data Platform extension for deployment of the Employee Data Product.
Configure the extension to connect to your target Semarchy Data Platform instance. In the Semarchy Data Platform extension settings, select the Workspace tab and configure the deployment properties below:

The Datasource is the name of any existing datasource used to establish the connection to the database. Consult with your platform administrator for a suitable datasource to use.

https:// https:///dpc 



Before deployment, Semarchy validates the Data Product design and uses Employee.DataProductProfile.seml for its technical configuration.

You have already reviewed this file earlier in the tutorial. The profile is required for every Data Product and defines its technical environment.
During validation, build, and deployment, the profile provides configuration such as the target database platform. The logical data model itself is defined by the collection of entity, reference, rule, and other SEML design files in the Data Product.
Before deploying your Data Product, validate it for errors and inconsistencies. Validation checks individual design files, while the build verifies that the SEML files work together correctly and generates the deployment payload.


Duration: 08:00
After a successful deployment, sign in to the Semarchy Data Platform and open the deployed Data Product to access its application.


Now you will import data and view it in your application.





Now you will import the Employee data and view it in your application.
Duration: 02:00
In this tutorial, you explored the Semarchy Data Platform Extension — a Visual Studio Code integration that allows you to design, validate, build, and deploy complete Data Products directly from your development environment.
By building the Employee Data Product and its MDM web application, you learned how to translate business requirements into a structured, governed logical data model.
You designed entities, attributes, and relationships; created enrichers and validations; defined match and survivorship rules; and finally built and deployed your model to the Semarchy Data Platform.
Throughout this experience, you discovered how the extension simplifies the modeling process, increases productivity, and gives developers and data stewards a unified workspace for managing every aspect of the data lifecycle.
By completing this tutorial, you have learned to:
Install and configure the Semarchy Data Platform Extension in Visual Studio Code.
Create a data project, Data Product package, and Data Product folder using the SDP workspace structure.
Build and configure entities such as Employee (fuzzy-matched) and Department (basic).
Define attributes, relationships, and metadata to represent your business domain.
Implement Lists of Values to ensure standardization and data consistency.
Add SemQL Enrichers to clean and normalize data.
Define a Unique Key on the Department entity and a SemQL Validation on the Employee entity to enforce integrity before and after consolidation.
Design Match Rules using normalized comparisons.
Apply Merge Thresholds and Auto-Confirm logic to generate golden records.
Add and prioritize Publishers (HR, ATS, Payroll).
Create Survivorship Rules that determine how final golden values are chosen.
Configure deployment settings, validate and build the Data Product, deploy it, and import sample data.
Access the application through the Semarchy Data Platform and validate your results.
Now that you've built and deployed your Employee application, you can continue practicing by exploring more features on your own. Try adding new attributes or LOVs, refining your match rules, customizing forms and views, or loading additional sample data to test how your application behaves with real-world scenarios.
We will also be releasing new tutorials soon, covering advanced UI configuration, workflows, integrations, and more. Stay tuned for the next steps in your learning journey!