diff --git a/404.html b/404.html index 37fc82350..9eae0599b 100644 --- a/404.html +++ b/404.html @@ -249,11 +249,11 @@ }); }); }); -

+

404

Oops, this isn't the tool you were looking for!

Don't let this hiccup slow you down. Let's get you back to building your masterpiece.

Ditty Bijil
Ditty Bijil
  • Oct 7, 2024
  • 3 min read +
    Ditty Bijil
    Ditty Bijil
    • Oct 7, 2024
    • 3 min read

    How surveilr Transforms Secure Health Data Exchange in Clinical Workflows

    Secure health data exchange

    In today’s rapidly changing healthcare landscape, the exchange of clinical data is paramount, where safety and efficiency are essentials. Therefore, Direct Secure Messaging (DSM) is a crucial concept for safe communication among the stakeholders within the healthcare sector, ensuring sensitive information not openly shared but among authorized parties. However, with all its benefits, managing, processing, and consolidating such messages becomes a challenge for the HISP. This is where surveilr comes in-a stateful data preparation and integration platform designed to simplify and enhance DSM services by automating message ingestion, processing, and ensuring regulatory compliance.

    @@ -342,4 +342,4 @@

    Conclusion

    Related articles
\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/blog/direct-messaging-service-pattern/index.html.br b/blog/direct-messaging-service-pattern/index.html.br index 32a7d67aa..8df23adce 100644 Binary files a/blog/direct-messaging-service-pattern/index.html.br and b/blog/direct-messaging-service-pattern/index.html.br differ diff --git a/blog/evidence-based-decision-making-pattern/index.html b/blog/evidence-based-decision-making-pattern/index.html index 31921751b..06771045a 100644 --- a/blog/evidence-based-decision-making-pattern/index.html +++ b/blog/evidence-based-decision-making-pattern/index.html @@ -250,7 +250,7 @@ }); }); }); -
Avatar Description
Shahid N. Shah
\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/blog/evidence-based-decision-making-pattern/index.html.br b/blog/evidence-based-decision-making-pattern/index.html.br index 2f99328d1..ce24591c5 100644 Binary files a/blog/evidence-based-decision-making-pattern/index.html.br and b/blog/evidence-based-decision-making-pattern/index.html.br differ diff --git a/blog/index.html b/blog/index.html index 999c4c243..7105391ef 100644 --- a/blog/index.html +++ b/blog/index.html @@ -249,7 +249,7 @@ }); }); }); -

Stay up-to-date on the latest news and releases

Explore the latest news, tips, and insights from surveilr to enhance your security and compliance projects. From pattern spotlights to project management strategies, our blog is your go-to resource.

Stay up-to-date on the latest news and releases

Explore the latest news, tips, and insights from surveilr to enhance your security and compliance projects. From pattern spotlights to project management strategies, our blog is your go-to resource.

\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/blog/index.html.br b/blog/index.html.br index 11a085a06..10e1bca55 100644 Binary files a/blog/index.html.br and b/blog/index.html.br differ diff --git a/blog/power-of-sql-and-sql-views/index.html b/blog/power-of-sql-and-sql-views/index.html index 6d3877fb8..b4870dfb0 100644 --- a/blog/power-of-sql-and-sql-views/index.html +++ b/blog/power-of-sql-and-sql-views/index.html @@ -250,7 +250,7 @@ }); }); }); -
Avatar Description
Pradeep Narayanan
  • Oct 7, 2024
  • 5 min read +
    Avatar Description
    Pradeep Narayanan
    • Oct 7, 2024
    • 5 min read

    Unlocking surveilr's Full Potential the Smart Way: The Power of SQL and SQL views capabilities

    `surveilr` based data analysis and web UI

    In the world of data integration and processing, flexibility and extensibility are paramount. The ability to easily prepare, integrate, and analyze data from multiple sources is critical. surveilr, with its stateful, local-first, and edge-based architecture, stands out as a powerful solution for these challenges. One of the key strengths of surveilr is its SQL-centric nature, making it both flexible and extendable. And when it comes to maximizing this power, there’s no better tool in the SQL toolbox than SQL views.

    The Foundation: SQL in surveilr

    At the core of surveilr is its SQL-centric approach. Every piece of data it processes is queryable using SQL, allowing users to manipulate and organize information in a way that best fits their workflow. This SQL-centric design makes it easy to set up data pipelines, perform complex transformations, and create relationships between disparate data sources. Whether you’re working with clinical operations data, auditing evidence collection and reporting, pharmacy records, billing information, or any other type of clinical or non-clinical data, SQL provides a robust foundation to access and modify that data seamlessly and effortlessly.

    @@ -312,4 +312,4 @@

    Conclusion

    Related articles
\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/blog/power-of-sql-and-sql-views/index.html.br b/blog/power-of-sql-and-sql-views/index.html.br index 162ba5679..e7074fc49 100644 Binary files a/blog/power-of-sql-and-sql-views/index.html.br and b/blog/power-of-sql-and-sql-views/index.html.br differ diff --git a/blog/quality-management-pattern/index.html b/blog/quality-management-pattern/index.html index f6d946c3f..af035e894 100644 --- a/blog/quality-management-pattern/index.html +++ b/blog/quality-management-pattern/index.html @@ -250,7 +250,7 @@ }); }); }); -
Avatar Description
Shahid N. Shah
\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/blog/quality-management-pattern/index.html.br b/blog/quality-management-pattern/index.html.br index 857134c61..39a6fd6f6 100644 Binary files a/blog/quality-management-pattern/index.html.br and b/blog/quality-management-pattern/index.html.br differ diff --git a/blog/rssd-excel-portability-sql-power/index.html b/blog/rssd-excel-portability-sql-power/index.html index e4bd3f20f..fe038a4be 100644 --- a/blog/rssd-excel-portability-sql-power/index.html +++ b/blog/rssd-excel-portability-sql-power/index.html @@ -250,7 +250,7 @@ }); }); }); -
Avatar Description
Shahid N. Shah
\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/blog/rssd-excel-portability-sql-power/index.html.br b/blog/rssd-excel-portability-sql-power/index.html.br index 740a8287c..596fe3b5e 100644 Binary files a/blog/rssd-excel-portability-sql-power/index.html.br and b/blog/rssd-excel-portability-sql-power/index.html.br differ diff --git a/blog/sql-based-etl-elt/index.html b/blog/sql-based-etl-elt/index.html index 13db04936..be1e78d5f 100644 --- a/blog/sql-based-etl-elt/index.html +++ b/blog/sql-based-etl-elt/index.html @@ -250,7 +250,7 @@ }); }); }); -
Shahid Shah
Shahid N. Shah
  • Oct 8, 2024
  • 3 min read +
    Shahid Shah
    Shahid N. Shah
    • Oct 8, 2024
    • 3 min read

    Modern Lightweight ETL with SQLite

    Lightweight ETL

    If you’re an SQL engineer trying to learn the ropes of data engineering, you might have heard the term ELT and wondered how it differs from ETL. Both are processes for integrating data from multiple sources, but ELT stands for Extract, Load, Transform, while ETL is Extract, Transform, Load. In this blog post, we will explore how to leverage SQLite and SQL views for a lightweight ELT process that integrates disparate tables into a unified view.

    Our specific use case will involve aggregating patient remote monitoring data from various devices into a single unified view for Continuous Glucose Monitoring (CGM) tracings. We’ll break down each step in a way that’s approachable and practical, giving you the tools to work with real data while keeping the infrastructure lightweight.

    Background on ELT and Why We Use It

    @@ -369,4 +369,4 @@

    Next Steps

    Related articles
\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/blog/sql-based-etl-elt/index.html.br b/blog/sql-based-etl-elt/index.html.br index e8def87c6..f123987e1 100644 Binary files a/blog/sql-based-etl-elt/index.html.br and b/blog/sql-based-etl-elt/index.html.br differ diff --git a/blog/surveilr-core-vs-patterns/index.html b/blog/surveilr-core-vs-patterns/index.html index 4f0a5623d..bc2a86faa 100644 --- a/blog/surveilr-core-vs-patterns/index.html +++ b/blog/surveilr-core-vs-patterns/index.html @@ -250,7 +250,7 @@ }); }); }); -
Shahid Shah
Shahid N. Shah
\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/blog/surveilr-core-vs-patterns/index.html.br b/blog/surveilr-core-vs-patterns/index.html.br index 2250d13d4..18e63e8af 100644 Binary files a/blog/surveilr-core-vs-patterns/index.html.br and b/blog/surveilr-core-vs-patterns/index.html.br differ diff --git a/blog/surveilr-integration-engine/index.html b/blog/surveilr-integration-engine/index.html index 1f92afc76..4fabf21c4 100644 --- a/blog/surveilr-integration-engine/index.html +++ b/blog/surveilr-integration-engine/index.html @@ -250,7 +250,7 @@ }); }); }); -
Avatar Description
Pradeep Narayanan
\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/blog/surveilr-integration-engine/index.html.br b/blog/surveilr-integration-engine/index.html.br index 01c0d7470..bd920e0a2 100644 Binary files a/blog/surveilr-integration-engine/index.html.br and b/blog/surveilr-integration-engine/index.html.br differ diff --git a/blog/vendor-assessments/index.html b/blog/vendor-assessments/index.html index 19e805eeb..fd2892ef1 100644 --- a/blog/vendor-assessments/index.html +++ b/blog/vendor-assessments/index.html @@ -250,7 +250,7 @@ }); }); }); -
Shahid N. Shah
Shahid N. Shah
\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/blog/vendor-assessments/index.html.br b/blog/vendor-assessments/index.html.br index ba7d405e6..b83c0721e 100644 Binary files a/blog/vendor-assessments/index.html.br and b/blog/vendor-assessments/index.html.br differ diff --git a/blog/why-stateful-integration/index.html b/blog/why-stateful-integration/index.html index 8ea37d515..1782cb5a4 100644 --- a/blog/why-stateful-integration/index.html +++ b/blog/why-stateful-integration/index.html @@ -250,7 +250,7 @@ }); }); }); -
Avatar Description
Shahid N. Shah
\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/blog/why-stateful-integration/index.html.br b/blog/why-stateful-integration/index.html.br index 6291bf99f..a90c0a913 100644 Binary files a/blog/why-stateful-integration/index.html.br and b/blog/why-stateful-integration/index.html.br differ diff --git a/contact/index.html b/contact/index.html index 6dab347b8..5eab584ee 100644 --- a/contact/index.html +++ b/contact/index.html @@ -249,7 +249,7 @@ }); }); }); -

Contact us

Have questions or want to discuss a project? Reach out, and let's craft the perfect solution with our tools and services.

Fill in the form below

We'll get back to you in 1-2 business days.

Knowledgebase

Browse through all of our knowledgebase articles.

Contact us

Have questions or want to discuss a project? Reach out, and let's craft the perfect solution with our tools and services.

Fill in the form below

We'll get back to you in 1-2 business days.

\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/contact/index.html.br b/contact/index.html.br index 3813361a6..994b70849 100644 Binary files a/contact/index.html.br and b/contact/index.html.br differ diff --git a/index.html b/index.html index 41c9d65a2..fa2d5a162 100644 --- a/index.html +++ b/index.html @@ -250,10 +250,10 @@ }); }); }); -

Continuous Security, Quality and Compliance Evidence

surveilr ensures your organization’s cybersecurity, quality metrics, and regulatory compliance efforts are backed by a SQL queryable private evidence warehouse that can fit on your laptop — fully auditable without IT support and with little to no human intervention. +

Continuous Security, Quality and Compliance Evidence

surveilr ensures your organization’s cybersecurity, quality metrics, and regulatory compliance efforts are backed by a SQL queryable private evidence warehouse that can fit on your laptop — fully auditable without IT support and with little to no human intervention.

surveilr is a downloadable single binary that securely runs on Windows, Linux, and MacOS in your infrastructure. Your data is always private and can only be shared if you allow it.

It's your data, don't give it away to AI scrapers or cloud vendors for free.

Stack of survelir pattern boxes containing assorted hardware tools
survelir patterns in floating boxes

Meeting Industry Demands

The Resource Surveillance & Integration Engine is designed to address modern challenges by providing a centralized platform for evidence surveillance and data aggregation, enabling organizations to securely collect, analyze and audit critical evidentiary data from across their systems.

Stateful, Local-first, Edge-based

Unlike simple data transfer tools, surveilr doesn’t just move information between systems. It stores and organizes data in a way that is standardized, making it easy to query and manage - on local devices, laptops, or edge systems keeping sensitive data secure.

Streamlined Compliance

surveilr ensures that all compliance evidence is collected, organized, and ready for audit, saving time and reducing human error.

Private and Secure

Data Security: surveilr’s edge-based approach ensures data stays secure by limiting unnecessary movement of sensitive information. Only what’s needed is transferred to central servers, reducing exposure and risks.

Comprehensive Documentation

Integrate with ease using surveilr's exhaustive guides and libraries. Achieve seamless pattern adoption with our full suite of documentation designed for your success.

Use surveilr's capabilities across multiple mission- and safety-critical use cases (called Patterns). -

Yellow and black heavy equipment on brown grass field

Frequently
asked questions

surveilr is built with security-first principles. It automatically collects and aggregates security logs, tracks incidents, and stores all data in a centralized, secured environment. It also allows organizations to generate machine-attestable evidence that can be used to demonstrate compliance with security protocols and standards.

Let's Build Together

Ready to start using the Resource Surveillance and Integration Engine?

surveilr logo

Stay up to date

Stay updated with the latest tools and exclusive deals.

+

Yellow and black heavy equipment on brown grass field

Frequently
asked questions

No. surveilr uses a modular approach with pre-built Patterns—packages designed for specific industries, professional disciplines, and universal use cases. You can simply select the Patterns that apply to your organization, and the platform will automatically handle the data collection and reporting needed for those specific use cases, requiring little to no customization.

Let's Build Together

Ready to start using the Resource Surveillance and Integration Engine?

\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/index.html.br b/index.html.br index 7b33224c0..093aef5ce 100644 Binary files a/index.html.br and b/index.html.br differ diff --git a/insights/advanced-polyglot-orchestration/index.html b/insights/advanced-polyglot-orchestration/index.html index 28da45b54..71a79681c 100644 --- a/insights/advanced-polyglot-orchestration/index.html +++ b/insights/advanced-polyglot-orchestration/index.html @@ -250,7 +250,7 @@ }); }); }); -
Lightweight ETL

Orchestration with JavaScript and Python

The Resource Surveillance & Integration Engine, known as surveilr, offers extensive built-in capabilities for ingestion, ETL, ELT, and other integration tasks. Many of these tasks can be orchestrated declaratively within SQL using the SQLite ecosystem alongside the extension functions and virtual tables provided by surveilr. By leveraging the versatility of SQLite, surveilr can handle a range of transformations, integrations, and data workflows, all from within the database itself.

+
Lightweight ETL

Orchestration with JavaScript and Python

The Resource Surveillance & Integration Engine, known as surveilr, offers extensive built-in capabilities for ingestion, ETL, ELT, and other integration tasks. Many of these tasks can be orchestrated declaratively within SQL using the SQLite ecosystem alongside the extension functions and virtual tables provided by surveilr. By leveraging the versatility of SQLite, surveilr can handle a range of transformations, integrations, and data workflows, all from within the database itself.

However, there are scenarios where more complex orchestration is needed—tasks that require imperative programming, advanced logic, or capabilities beyond what surveilr provides out of the box. In such cases, languages like TypeScript and JavaScript (using Deno or NodeJS), Python, and many others that support SQLite integration come to the rescue. The Resource Surveillance State Database (RSSD), which is an opinionated SQLite database, provides a strong foundation for multi-modal ingestion and transformation, making it ideal for advanced orchestration using external languages and tools.

In this blog post, we will explore advanced orchestration strategies using various languages to complement surveilr. We will provide examples from a compliance and evidence-gathering perspective, using uniform_resource and related tables to demonstrate how to manage resources, track provenance, and execute sophisticated integration workflows. One of the key strengths of the RSSD format is that it is fully portable across different language ecosystems, which allows developers to use the tools and languages best suited for their specific orchestration needs.

Orchestration with Declarative SQL in surveilr

@@ -303,4 +303,4 @@

Conclusion

The uniform_resource table, with its constellation of related tables, forms the core of resource management, compliance, and evidence tracking. Using languages like TypeScript, JavaScript, Python, and others to orchestrate workflows around RSSD databases can empower you to handle even the most complex compliance and integration challenges.

Do you have use cases that require advanced orchestration? We’d love to hear how you integrate surveilr with your favorite programming languages to create powerful, compliance-focused workflows.

\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/insights/advanced-polyglot-orchestration/index.html.br b/insights/advanced-polyglot-orchestration/index.html.br index 199793429..ba3332f4a 100644 Binary files a/insights/advanced-polyglot-orchestration/index.html.br and b/insights/advanced-polyglot-orchestration/index.html.br differ diff --git a/insights/index.html b/insights/index.html index 50e9d132d..6c7f11bcf 100644 --- a/insights/index.html +++ b/insights/index.html @@ -249,6 +249,6 @@ }); }); }); -

Insights

Stay up-to-date with the latest trends and developments in the compliance industry with insights from our team of industry experts.

\ No newline at end of file diff --git a/insights/index.html.br b/insights/index.html.br index e4747cbc8..82c3962e1 100644 Binary files a/insights/index.html.br and b/insights/index.html.br differ diff --git a/insights/why-sqlite-for-rssd/index.html b/insights/why-sqlite-for-rssd/index.html index c651dea6a..1f52a7bbe 100644 --- a/insights/why-sqlite-for-rssd/index.html +++ b/insights/why-sqlite-for-rssd/index.html @@ -250,7 +250,7 @@ }); }); }); -
SQLite versatility

Why SQLite for RSSD?

At the heart of RSSD (Resource Surveillance & Integration Engine) is the need for a database that can efficiently handle vast and complex data while maintaining ease of use. For this, we chose SQLite, a powerful yet lightweight SQL engine. SQLite excels in small applications but can also scale up to large-scale use cases—making it the perfect choice for RSSD. Let’s explore why SQLite is ideal for this system.

+
SQLite versatility

Why SQLite for RSSD?

At the heart of RSSD (Resource Surveillance & Integration Engine) is the need for a database that can efficiently handle vast and complex data while maintaining ease of use. For this, we chose SQLite, a powerful yet lightweight SQL engine. SQLite excels in small applications but can also scale up to large-scale use cases—making it the perfect choice for RSSD. Let’s explore why SQLite is ideal for this system.

1. The Simplicity of an Excel File

One of the key reasons we chose SQLite is its simplicity. Like Excel, which is widely known for its ease of use in handling structured data, SQLite can store, manipulate, and analyze data without the need for complex infrastructure. It operates as a self-contained file-based system, meaning no additional software or server setup is required.
SQLite databases are portable, acting as standalone files. This characteristic makes them ideal for scenarios where data portability is critical, such as environments that require frequent sharing or auditing of data. The ability to download a SQLite database and open it with standard tools mirrors the ease of working with Excel, but it delivers the powerful querying capabilities of SQL—hence the tagline, “Portability of Excel, Power of SQL.” More on this topic can be found in our detailed post.

@@ -281,4 +281,4 @@

Bibliography

\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/insights/why-sqlite-for-rssd/index.html.br b/insights/why-sqlite-for-rssd/index.html.br index b321655d9..86923e5f1 100644 Binary files a/insights/why-sqlite-for-rssd/index.html.br and b/insights/why-sqlite-for-rssd/index.html.br differ diff --git a/legal/cli-eula/index.html b/legal/cli-eula/index.html index b9eae62ce..115bf9168 100644 --- a/legal/cli-eula/index.html +++ b/legal/cli-eula/index.html @@ -250,7 +250,7 @@ }); }); }); -

End User License Agreement (EULA) for Resource Surveillance & Integration Engine (surveilr) CLI App

Effective Date: January 1, 2024

+

End User License Agreement (EULA) for Resource Surveillance & Integration Engine (surveilr) CLI App

Effective Date: January 1, 2024

PLEASE READ THIS END USER LICENSE AGREEMENT (“AGREEMENT”) CAREFULLY BEFORE USING THE surveilr BINARY SOFTWARE (“SOFTWARE”). BY USING THE SOFTWARE, YOU AGREE TO BE BOUND BY THIS AGREEMENT. IF YOU DO NOT AGREE WITH THESE TERMS, DO NOT USE THE SOFTWARE.

This End User License Agreement (“Agreement”) is a legal agreement between you (either an individual or a legal entity, referred to as “User” or “You”) and the creators of surveilr (“Licensor”) for the use of the surveilr binary software.

1. Grant of License

@@ -287,4 +287,4 @@

10. Severability

Licensor: Netspective Communications LLC

Contact Information: help@surveilr.com

\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/legal/cli-eula/index.html.br b/legal/cli-eula/index.html.br index 7aa44f6a4..95f022e02 100644 Binary files a/legal/cli-eula/index.html.br and b/legal/cli-eula/index.html.br differ diff --git a/lib/pattern/osquery/package.sql b/lib/pattern/osquery/package.sql index 3ce8176e4..98ed8b9aa 100644 --- a/lib/pattern/osquery/package.sql +++ b/lib/pattern/osquery/package.sql @@ -3,7 +3,7 @@ CREATE TEMP TABLE IF NOT EXISTS "session_state_ephemeral" ( "value" TEXT NOT NULL ); INSERT INTO "code_notebook_kernel" ("code_notebook_kernel_id", "kernel_name", "description", "mime_type", "file_extn", "elaboration", "governance", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('SQL', 'SQLite SQL Statements', NULL, 'application/sql', '.sql', NULL, NULL, (CURRENT_TIMESTAMP), (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'), NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET code_notebook_kernel_id = COALESCE(EXCLUDED.code_notebook_kernel_id, code_notebook_kernel_id), kernel_name = COALESCE(EXCLUDED.kernel_name, kernel_name), description = COALESCE(EXCLUDED.description, description), mime_type = COALESCE(EXCLUDED.mime_type, mime_type), file_extn = COALESCE(EXCLUDED.file_extn, file_extn), governance = COALESCE(EXCLUDED.governance, governance), elaboration = COALESCE(EXCLUDED.elaboration, elaboration), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'); -INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB95PPEKNAHVCQ78HGV7ZRRP', 'SQL', 'osquery', 'infoSchemaOsQueryATCs', NULL, 'WITH table_columns AS ( +INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB9AH1004297ZZNWM25N2C72', 'SQL', 'osquery', 'infoSchemaOsQueryATCs', NULL, 'WITH table_columns AS ( SELECT m.tbl_name AS table_name, group_concat(c.name) AS column_names_for_select, json_group_array(c.name) AS column_names_for_atc_json diff --git a/lib/service/diabetes-research-hub/dataset-specific-package/anderson.sql b/lib/service/diabetes-research-hub/dataset-specific-package/anderson.sql index 0bff2736d..810d76d2c 100644 --- a/lib/service/diabetes-research-hub/dataset-specific-package/anderson.sql +++ b/lib/service/diabetes-research-hub/dataset-specific-package/anderson.sql @@ -3311,23 +3311,7 @@ SELECT ''/drh/cgm-combined-data/index.sql'' AS link, ''Explore the comprehensive CGM dataset, integrating glucose monitoring data from all participants for in-depth analysis of glycemic patterns and trends across the study.'' AS description, ''book'' as icon, - ''red'' as color; - - -SELECT - ''Combined CGM Tracing'' AS title, - ''/drh/cgm-combined-data/index.sql'' AS link, - ''Explore the comprehensive CGM dataset, integrating glucose monitoring data from all participants for in-depth analysis of glycemic patterns and trends across the study.'' AS description, - ''book'' as icon, - ''red'' as color; - - -SELECT - ''Combined CGM Tracing'' AS title, - ''/drh/cgm-combined-data/index.sql'' AS link, - ''Explore the comprehensive CGM dataset, integrating glucose monitoring data from all participants for in-depth analysis of glycemic patterns and trends across the study.'' AS description, - ''book'' as icon, - ''red'' as color; + ''red'' as color; SELECT @@ -4208,7 +4192,7 @@ FROM ''text'' as component, ''# Participant Dashboard'' as contents_md; - SET total_rows = (SELECT COUNT(*) FROM drh_participant); + SET total_rows = (SELECT COUNT(*) FROM study_combined_dashboard_participant_metrics_view); SET limit = COALESCE($limit, 50); SET offset = COALESCE($offset, 0); SET total_pages = ($total_rows + $limit - 1) / $limit; @@ -4218,8 +4202,8 @@ SET current_page = ($offset / $limit) + 1; SELECT ''table'' AS component, ''participant_id'' as markdown, TRUE AS sort, - TRUE AS search; - SELECT format(''[%s](/drh/participant-info/index.sql?participant_id=%s)'',participant_id, participant_id) as participant_id,gender,age,study_arm,baseline_hba1c FROM drh_participant + TRUE AS search; + SELECT format(''[%s](/drh/participant-info/index.sql?participant_id=%s)'',participant_id, participant_id) as participant_id,gender,age,study_arm,baseline_hba1c,tir,tar_vh,tar_h,tbr_l,tbr_vl,tar,tbr,gmi,percent_gv,gri,days_of_wear,data_start_date,data_end_date FROM study_combined_dashboard_participant_metrics_view LIMIT $limit OFFSET $offset; diff --git a/lib/service/diabetes-research-hub/dataset-specific-package/dclp1-uva-study.sql.ts b/lib/service/diabetes-research-hub/dataset-specific-package/dclp1-uva-study.sql.ts index 4d8004771..9d0dc439c 100644 --- a/lib/service/diabetes-research-hub/dataset-specific-package/dclp1-uva-study.sql.ts +++ b/lib/service/diabetes-research-hub/dataset-specific-package/dclp1-uva-study.sql.ts @@ -13,6 +13,16 @@ export class uvadclp1SqlPages extends spn.TypicalSqlPageNotebook { ${sqlStatements} `; } + + //metrics static views shall be generated after the combined_cgm_tracing is created. + async statelessMetricsSQL() { + // stateless SQL for the metrics + return await spn.TypicalSqlPageNotebook.fetchText( + import.meta.resolve( + "../drh-metrics.sql", + ), + ); + } } export async function uvadclp1SQL() { @@ -31,6 +41,7 @@ export async function uvadclp1SQL() { ), ); } + }(), ...(await pkg.drhNotebooks()), new uvadclp1SqlPages(), diff --git a/lib/service/diabetes-research-hub/drh-metrics.sql b/lib/service/diabetes-research-hub/drh-metrics.sql index bb4a08b46..433d9a36a 100644 --- a/lib/service/diabetes-research-hub/drh-metrics.sql +++ b/lib/service/diabetes-research-hub/drh-metrics.sql @@ -9,75 +9,8 @@ FROM combined_cgm_tracing GROUP BY participant_id; - --- Drop the view if it exists -DROP VIEW IF EXISTS drh_mean_glucose; - --- Create the view to calculate mean glucose for each participant -CREATE VIEW drh_mean_glucose AS -SELECT - participant_id, - ROUND(AVG(CGM_Value), 2) AS mean_glucose -FROM - combined_cgm_tracing -GROUP BY - participant_id; - - -- Drop the view if it exists -DROP VIEW IF EXISTS drh_cgm_worn_days; - --- Create the view to calculate the number of days CGM worn for each participant -CREATE VIEW drh_cgm_worn_days AS -SELECT - participant_id, - COUNT(DISTINCT DATE(Date_Time)) AS number_of_days_cgm_worn -FROM - combined_cgm_tracing -GROUP BY - participant_id; - - --- Drop the view if it exists -DROP VIEW IF EXISTS drh_percentage_active_days; - --- Create the view to calculate the percentage of active days for each participant -CREATE VIEW drh_percentage_active_days AS -SELECT - participant_id, - ROUND( - (COUNT(DISTINCT DATE(Date_Time)) / - ROUND((julianday(MAX(Date_Time)) - julianday(MIN(Date_Time)) + 1)) - ) * 100, 2) AS percentage_active -FROM - combined_cgm_tracing -GROUP BY - participant_id; - - --- Drop the view if it exists -DROP VIEW IF EXISTS drh_glucose_management_indicator; - --- Create the view to calculate the GMI for each participant -CREATE VIEW drh_glucose_management_indicator AS -SELECT - participant_id, - ROUND(AVG(CGM_Value) * 0.155 + 95, 2) AS gmi -FROM - combined_cgm_tracing -GROUP BY - participant_id; - - -DROP VIEW IF EXISTS drh_coefficient_of_variation; --- Create the view to calculate the coefficient_of_variation for each participant -CREATE VIEW drh_coefficient_of_variation AS -SELECT participant_id,ROUND((SQRT(AVG(CGM_Value * CGM_Value) - AVG(CGM_Value) * AVG(CGM_Value)) / AVG(CGM_Value)) * 100, 2) AS coefficient_of_variation -FROM combined_cgm_tracing -GROUP BY - participant_id; - DROP VIEW IF EXISTS drh_participant_metrics; @@ -409,6 +342,59 @@ FROM ( +DROP VIEW IF EXISTS study_combined_dashboard_participant_metrics_view; +CREATE VIEW study_combined_dashboard_participant_metrics_view AS +WITH combined_data AS ( + SELECT + CAST(SUBSTR(dg.participant_id, 1, INSTR(dg.participant_id, '-') - 1) AS TEXT) AS study_id, + dg.participant_id, + dg.gender, + dg.age, + dg.study_arm, + dg.baseline_hba1c, + ROUND(SUM(CASE WHEN dc.CGM_Value BETWEEN 70 AND 180 THEN 1 ELSE 0 END) * 1.0 / COUNT(dc.CGM_Value) * 100, 2) AS tir, + ROUND(SUM(CASE WHEN dc.CGM_Value > 250 THEN 1 ELSE 0 END) * 1.0 / COUNT(dc.CGM_Value) * 100, 2) AS tar_vh, + ROUND(SUM(CASE WHEN dc.CGM_Value BETWEEN 181 AND 250 THEN 1 ELSE 0 END) * 1.0 / COUNT(dc.CGM_Value) * 100, 2) AS tar_h, + ROUND(SUM(CASE WHEN dc.CGM_Value BETWEEN 54 AND 69 THEN 1 ELSE 0 END) * 1.0 / COUNT(dc.CGM_Value) * 100, 2) AS tbr_l, + ROUND(SUM(CASE WHEN dc.CGM_Value < 54 THEN 1 ELSE 0 END) * 1.0 / COUNT(dc.CGM_Value) * 100, 2) AS tbr_vl, + ROUND(SUM(CASE WHEN dc.CGM_Value > 180 THEN 1 ELSE 0 END) * 1.0 / COUNT(dc.CGM_Value)*100, 2) AS tar, + ROUND(SUM(CASE WHEN dc.CGM_Value < 70 THEN 1 ELSE 0 END) * 1.0 / COUNT(dc.CGM_Value)*100, 2) AS tbr, + CEIL((AVG(dc.CGM_Value) * 0.155) + 95) AS gmi, + ROUND((SQRT(AVG(dc.CGM_Value * dc.CGM_Value) - AVG(dc.CGM_Value) * AVG(dc.CGM_Value)) / AVG(dc.CGM_Value)) * 100, 2) AS percent_gv, + ROUND((3.0 * ((SUM(CASE WHEN dc.CGM_Value < 54 THEN 1 ELSE 0 END) * 100.0 / COUNT(*)) + (0.8 * (SUM(CASE WHEN dc.CGM_Value BETWEEN 54 AND 69 THEN 1 ELSE 0 END) * 100.0 / COUNT(*))))) + (1.6 * ((SUM(CASE WHEN dc.CGM_Value > 250 THEN 1 ELSE 0 END) * 100.0 / COUNT(*)) + (0.5 * (SUM(CASE WHEN dc.CGM_Value BETWEEN 181 AND 250 THEN 1 ELSE 0 END) * 100.0 / COUNT(*)) ))), 2) AS gri, + COUNT(DISTINCT DATE(dc.Date_Time)) AS days_of_wear, + MIN(DATE(dc.Date_Time)) AS data_start_date, + MAX(DATE(dc.Date_Time)) AS data_end_date + FROM drh_participant dg + JOIN combined_cgm_tracing dc ON dg.participant_id = dc.participant_id + GROUP BY study_id, dg.participant_id, dg.gender, dg.age, dg.study_arm, dg.baseline_hba1c +) +SELECT *, + ROUND( + COALESCE( + (days_of_wear * 1.0 / + (JULIANDAY(data_end_date) - JULIANDAY(data_start_date) + 1)) * 100, + 0), + 2) AS wear_time_percentage FROM combined_data; + + +DROP VIEW IF EXISTS participant_cgm_date_range_view; +CREATE VIEW participant_cgm_date_range_view AS +SELECT + participant_id, + CAST(strftime('%Y-%m-%d', MIN(Date_Time)) AS TEXT) AS participant_cgm_start_date, + CAST(strftime('%Y-%m-%d', MAX(Date_Time)) AS TEXT) AS participant_cgm_end_date, + CAST(strftime('%Y-%m-%d', DATE(MAX(Date_Time), '-1 day')) AS TEXT) AS end_date_minus_1_day, + CAST(strftime('%Y-%m-%d', DATE(MAX(Date_Time), '-7 day')) AS TEXT) AS end_date_minus_7_days, + CAST(strftime('%Y-%m-%d', DATE(MAX(Date_Time), '-14 day')) AS TEXT) AS end_date_minus_14_days, + CAST(strftime('%Y-%m-%d', DATE(MAX(Date_Time), '-30 day')) AS TEXT) AS end_date_minus_30_days, + CAST(strftime('%Y-%m-%d', DATE(MAX(Date_Time), '-90 day')) AS TEXT) AS end_date_minus_90_days +FROM + combined_cgm_tracing +GROUP BY + participant_id; + + diff --git a/lib/service/diabetes-research-hub/package.sql b/lib/service/diabetes-research-hub/package.sql index 70e05815d..991e2f375 100644 --- a/lib/service/diabetes-research-hub/package.sql +++ b/lib/service/diabetes-research-hub/package.sql @@ -1445,23 +1445,7 @@ SELECT ''/drh/cgm-combined-data/index.sql'' AS link, ''Explore the comprehensive CGM dataset, integrating glucose monitoring data from all participants for in-depth analysis of glycemic patterns and trends across the study.'' AS description, ''book'' as icon, - ''red'' as color; - - -SELECT - ''Combined CGM Tracing'' AS title, - ''/drh/cgm-combined-data/index.sql'' AS link, - ''Explore the comprehensive CGM dataset, integrating glucose monitoring data from all participants for in-depth analysis of glycemic patterns and trends across the study.'' AS description, - ''book'' as icon, - ''red'' as color; - - -SELECT - ''Combined CGM Tracing'' AS title, - ''/drh/cgm-combined-data/index.sql'' AS link, - ''Explore the comprehensive CGM dataset, integrating glucose monitoring data from all participants for in-depth analysis of glycemic patterns and trends across the study.'' AS description, - ''book'' as icon, - ''red'' as color; + ''red'' as color; SELECT @@ -2342,7 +2326,7 @@ FROM ''text'' as component, ''# Participant Dashboard'' as contents_md; - SET total_rows = (SELECT COUNT(*) FROM drh_participant); + SET total_rows = (SELECT COUNT(*) FROM study_combined_dashboard_participant_metrics_view); SET limit = COALESCE($limit, 50); SET offset = COALESCE($offset, 0); SET total_pages = ($total_rows + $limit - 1) / $limit; @@ -2352,8 +2336,8 @@ SET current_page = ($offset / $limit) + 1; SELECT ''table'' AS component, ''participant_id'' as markdown, TRUE AS sort, - TRUE AS search; - SELECT format(''[%s](/drh/participant-info/index.sql?participant_id=%s)'',participant_id, participant_id) as participant_id,gender,age,study_arm,baseline_hba1c FROM drh_participant + TRUE AS search; + SELECT format(''[%s](/drh/participant-info/index.sql?participant_id=%s)'',participant_id, participant_id) as participant_id,gender,age,study_arm,baseline_hba1c,tir,tar_vh,tar_h,tbr_l,tbr_vl,tar,tbr,gmi,percent_gv,gri,days_of_wear,data_start_date,data_end_date FROM study_combined_dashboard_participant_metrics_view LIMIT $limit OFFSET $offset; diff --git a/lib/service/diabetes-research-hub/package.sql.ts b/lib/service/diabetes-research-hub/package.sql.ts index a410d600f..c7bfc2129 100644 --- a/lib/service/diabetes-research-hub/package.sql.ts +++ b/lib/service/diabetes-research-hub/package.sql.ts @@ -285,24 +285,8 @@ export class DRHSqlPages extends spn.TypicalSqlPageNotebook { '/drh/cgm-combined-data/index.sql' AS link, 'Explore the comprehensive CGM dataset, integrating glucose monitoring data from all participants for in-depth analysis of glycemic patterns and trends across the study.' AS description, 'book' as icon, - 'red' as color; - - - SELECT - 'Combined CGM Tracing' AS title, - '/drh/cgm-combined-data/index.sql' AS link, - 'Explore the comprehensive CGM dataset, integrating glucose monitoring data from all participants for in-depth analysis of glycemic patterns and trends across the study.' AS description, - 'book' as icon, - 'red' as color; - - - SELECT - 'Combined CGM Tracing' AS title, - '/drh/cgm-combined-data/index.sql' AS link, - 'Explore the comprehensive CGM dataset, integrating glucose monitoring data from all participants for in-depth analysis of glycemic patterns and trends across the study.' AS description, - 'book' as icon, - 'red' as color; - + 'red' as color; + SELECT 'PHI De-Identification Results' AS title, @@ -845,7 +829,7 @@ select siblingOrder: 12, }) "drh/study-participant-dashboard/index.sql"() { - const viewName = `drh_participant`; + const viewName = `study_combined_dashboard_participant_metrics_view`; const pagination = this.pagination({ tableOrViewName: viewName }); return this.SQL` ${this.activePageTitle()} @@ -955,8 +939,8 @@ select SELECT 'table' AS component, 'participant_id' as markdown, TRUE AS sort, - TRUE AS search; - SELECT format('[%s](/drh/participant-info/index.sql?participant_id=%s)',participant_id, participant_id) as participant_id,gender,age,study_arm,baseline_hba1c FROM ${viewName} + TRUE AS search; + SELECT format('[%s](/drh/participant-info/index.sql?participant_id=%s)',participant_id, participant_id) as participant_id,gender,age,study_arm,baseline_hba1c,tir,tar_vh,tar_h,tbr_l,tbr_vl,tar,tbr,gmi,percent_gv,gri,days_of_wear,data_start_date,data_end_date FROM ${viewName} LIMIT $limit OFFSET $offset; diff --git a/lib/service/diabetes-research-hub/study-specific-stateless/dclp1-stateless.sql b/lib/service/diabetes-research-hub/study-specific-stateless/dclp1-stateless.sql index ce5073b8e..4e49896b9 100644 --- a/lib/service/diabetes-research-hub/study-specific-stateless/dclp1-stateless.sql +++ b/lib/service/diabetes-research-hub/study-specific-stateless/dclp1-stateless.sql @@ -1238,7 +1238,7 @@ SET diagnostics_json = '{"status": "completed"}', -- Diagnostics status in JSON format diagnostics_md = 'Verification Validation process completed' -- Markdown summary WHERE orchestration_session_id = (SELECT orchestration_session_id FROM temp_session_info LIMIT 1); -- Update the session identified in the temp view - +------------------------------------------------------------------------------------------------------------------------------------ -- Drop and recreate the device view DROP VIEW IF EXISTS drh_device; @@ -1376,12 +1376,6 @@ SELECT study_id, site_id, site_name, site_type FROM uniform_resource_site; --- SQLPage query to count tables matching the pattern 'uniform_resource_cgm_tracing%' -DROP VIEW IF EXISTS drh_number_of_cgm_tracing_files_view; -CREATE VIEW drh_number_of_cgm_tracing_files_view AS -SELECT COUNT(*) AS table_count -FROM sqlite_master -WHERE type = 'table' AND name LIKE 'uniform_resource_cgm_tracing%'; -- Drop and recreate the vw_orchestration_deidentify view DROP VIEW IF EXISTS drh_vw_orchestration_deidentify; @@ -1481,6 +1475,19 @@ SELECT count(*) as number_of_cgm_raw_files FROM sqlite_master WHERE type = 'table' AND name LIKE 'uniform_resource_cgm_tracing%'; +DROP VIEW IF EXISTS study_wise_csv_file_names; +CREATE VIEW study_wise_csv_file_names AS +SELECT name +FROM sqlite_master +WHERE type = 'table' AND name LIKE 'uniform_resource_%' and name !='uniform_resource_transform'; + + +DROP VIEW IF EXISTS study_wise_number_cgm_raw_files_count; +CREATE VIEW study_wise_number_cgm_raw_files_count AS +SELECT count(*) as number_of_cgm_raw_files +FROM sqlite_master +WHERE type = 'table' AND name LIKE 'uniform_resource_cgm_tracing%'; + -- DROP VIEW IF EXISTS drh_participant_file_names; -- CREATE VIEW IF NOT EXISTS drh_participant_file_names AS @@ -1505,11 +1512,12 @@ SELECT s.study_id, (CAST(SUM(CASE WHEN p.gender = 'F' THEN 1 ELSE 0 END) AS FLOAT) / COUNT(*)) * 100 AS percentage_of_females, GROUP_CONCAT(DISTINCT i.investigator_name) AS investigators FROM uniform_resource_study s -LEFT JOIN uniform_resource_participant p ON s.study_id = p.study_id +LEFT JOIN drh_participant p ON s.study_id = p.study_id LEFT JOIN uniform_resource_investigator i ON s.study_id = i.study_id GROUP BY s.study_id, s.study_name, s.study_description, s.start_date, s.end_date, s.nct_number; + DROP TABLE IF EXISTS raw_cgm_lst_cached; CREATE TABLE raw_cgm_lst_cached AS SELECT * FROM drh_raw_cgm_table_lst; diff --git a/lib/service/diabetes-research-hub/study-specific-stateless/generate-cgm-combined-sql.ts b/lib/service/diabetes-research-hub/study-specific-stateless/generate-cgm-combined-sql.ts index 5ac7f5ae6..e026115fb 100644 --- a/lib/service/diabetes-research-hub/study-specific-stateless/generate-cgm-combined-sql.ts +++ b/lib/service/diabetes-research-hub/study-specific-stateless/generate-cgm-combined-sql.ts @@ -105,7 +105,7 @@ export function generateDetrendedDSCombinedCGMViewSQL(dbFilePath: string): strin // Generate SQL for each participant's CGM data sqlParts.push(` SELECT - '${participantId}' AS participant_id, + TRIM('DFA-'||'${participantId}') AS participant_id, TRIM('2012-01-01 ' || hora ) AS Date_Time, CAST(glucemia AS REAL) AS CGM_Value FROM ${table_name} diff --git a/lib/std/lifecycle.sql b/lib/std/lifecycle.sql index f68d1dd0f..49197e8ac 100644 --- a/lib/std/lifecycle.sql +++ b/lib/std/lifecycle.sql @@ -254,7 +254,7 @@ INSERT INTO "code_notebook_kernel" ("code_notebook_kernel_id", "kernel_name", "d INSERT INTO "code_notebook_kernel" ("code_notebook_kernel_id", "kernel_name", "description", "mime_type", "file_extn", "elaboration", "governance", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('AI LLM Prompt', 'Generative AI Large Language Model Prompt', NULL, 'text/plain', '.llm-prompt.txt', NULL, NULL, (CURRENT_TIMESTAMP), (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'), NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET code_notebook_kernel_id = COALESCE(EXCLUDED.code_notebook_kernel_id, code_notebook_kernel_id), kernel_name = COALESCE(EXCLUDED.kernel_name, kernel_name), description = COALESCE(EXCLUDED.description, description), mime_type = COALESCE(EXCLUDED.mime_type, mime_type), file_extn = COALESCE(EXCLUDED.file_extn, file_extn), governance = COALESCE(EXCLUDED.governance, governance), elaboration = COALESCE(EXCLUDED.elaboration, elaboration), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'); INSERT INTO "code_notebook_kernel" ("code_notebook_kernel_id", "kernel_name", "description", "mime_type", "file_extn", "elaboration", "governance", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('Text Asset (.puml)', 'Text Asset (.puml)', NULL, 'text/plain', '.puml', NULL, NULL, (CURRENT_TIMESTAMP), (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'), NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET code_notebook_kernel_id = COALESCE(EXCLUDED.code_notebook_kernel_id, code_notebook_kernel_id), kernel_name = COALESCE(EXCLUDED.kernel_name, kernel_name), description = COALESCE(EXCLUDED.description, description), mime_type = COALESCE(EXCLUDED.mime_type, mime_type), file_extn = COALESCE(EXCLUDED.file_extn, file_extn), governance = COALESCE(EXCLUDED.governance, governance), elaboration = COALESCE(EXCLUDED.elaboration, elaboration), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'); INSERT INTO "code_notebook_kernel" ("code_notebook_kernel_id", "kernel_name", "description", "mime_type", "file_extn", "elaboration", "governance", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('Text Asset (.rs)', 'Text Asset (.rs)', NULL, 'text/plain', '.rs', NULL, NULL, (CURRENT_TIMESTAMP), (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'), NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET code_notebook_kernel_id = COALESCE(EXCLUDED.code_notebook_kernel_id, code_notebook_kernel_id), kernel_name = COALESCE(EXCLUDED.kernel_name, kernel_name), description = COALESCE(EXCLUDED.description, description), mime_type = COALESCE(EXCLUDED.mime_type, mime_type), file_extn = COALESCE(EXCLUDED.file_extn, file_extn), governance = COALESCE(EXCLUDED.governance, governance), elaboration = COALESCE(EXCLUDED.elaboration, elaboration), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'); -INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB95PVT3ZZFX999B2TFEVQY4', 'Documentation', 'rssd-init', 'Boostrap SQL', NULL, '-- code provenance: `RssdInitSqlNotebook.bootstrapDDL` (file:///home/runner/work/www.surveilr.com/www.surveilr.com/lib/std/lifecycle.sql.ts) +INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB9AH71C7F1857H3FGRW44DG', 'Documentation', 'rssd-init', 'Boostrap SQL', NULL, '-- code provenance: `RssdInitSqlNotebook.bootstrapDDL` (file:///home/runner/work/www.surveilr.com/www.surveilr.com/lib/std/lifecycle.sql.ts) INSERT INTO "session_state_ephemeral" ("key", "value") VALUES (''current_user'', ''runner'') ON CONFLICT DO UPDATE SET value = excluded.value; INSERT INTO "session_state_ephemeral" ("key", "value") VALUES (''current_user_name'', ''UNKNOWN'') ON CONFLICT DO UPDATE SET value = excluded.value; @@ -501,7 +501,7 @@ CREATE VIEW IF NOT EXISTS "code_notebook_migration_sql" AS ON c.code_notebook_cell_id = s.code_notebook_cell_id AND s.to_state = ''EXECUTED'' ORDER BY c.cell_name;', '937f852925c6c939d20b36517fdc121c45c50415', NULL, NULL, (CURRENT_TIMESTAMP), (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'), NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET description = COALESCE(EXCLUDED.description, description), cell_governance = COALESCE(EXCLUDED.cell_governance, cell_governance), interpretable_code = COALESCE(EXCLUDED.interpretable_code, interpretable_code), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'); -INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB95PVT4WWG021D9RFEWS4CE', 'SQL', 'ConstructionSqlNotebook', 'v001_once_initialDDL', NULL, '-- code provenance: `RssdInitSqlNotebook.v001_once_initialDDL` (file:///home/runner/work/www.surveilr.com/www.surveilr.com/lib/std/lifecycle.sql.ts) +INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB9AH71FYR13J6K075B5WCE4', 'SQL', 'ConstructionSqlNotebook', 'v001_once_initialDDL', NULL, '-- code provenance: `RssdInitSqlNotebook.v001_once_initialDDL` (file:///home/runner/work/www.surveilr.com/www.surveilr.com/lib/std/lifecycle.sql.ts) CREATE TABLE IF NOT EXISTS "party_type" ( "code" TEXT PRIMARY KEY NOT NULL, @@ -1281,7 +1281,7 @@ CREATE INDEX IF NOT EXISTS "idx_ur_ingest_session_plm_issue_type__id" ON "ur_ing CREATE INDEX IF NOT EXISTS "idx_ur_ingest_session_attachment__uniform_resource_id__content" ON "ur_ingest_session_attachment"("uniform_resource_id", "content"); CREATE INDEX IF NOT EXISTS "idx_ur_ingest_session_udi_pgp_sql__ingest_session_id" ON "ur_ingest_session_udi_pgp_sql"("ingest_session_id"); CREATE INDEX IF NOT EXISTS "idx_orchestration_nature__orchestration_nature_id__nature" ON "orchestration_nature"("orchestration_nature_id", "nature");', 'd5a380d80eb2fd3e468cd30130ef9367618788af', NULL, NULL, (CURRENT_TIMESTAMP), (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'), NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET description = COALESCE(EXCLUDED.description, description), cell_governance = COALESCE(EXCLUDED.cell_governance, cell_governance), interpretable_code = COALESCE(EXCLUDED.interpretable_code, interpretable_code), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'); -INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB95PVT4XFK2Q392NVP2NZEB', 'SQL', 'ConstructionSqlNotebook', 'v001_seedDML', NULL, 'INSERT INTO "ur_ingest_resource_path_match_rule" ("ur_ingest_resource_path_match_rule_id", "namespace", "regex", "flags", "nature", "priority", "description", "elaboration", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES (''ignore .git and node_modules paths'', ''default'', ''/(\.git|node_modules)/'', ''IGNORE_RESOURCE'', NULL, NULL, ''Ignore any entry with `/.git/` or `/node_modules/` in the path.'', NULL, (CURRENT_TIMESTAMP), NULL, NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET ur_ingest_resource_path_match_rule_id = COALESCE(EXCLUDED.ur_ingest_resource_path_match_rule_id, ur_ingest_resource_path_match_rule_id), namespace = COALESCE(EXCLUDED.namespace, namespace), regex = COALESCE(EXCLUDED.regex, regex), flags = COALESCE(EXCLUDED.flags, flags), description = COALESCE(EXCLUDED.description, description), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = ''current_user''); +INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB9AH71F5TNZZDNZP9J796GA', 'SQL', 'ConstructionSqlNotebook', 'v001_seedDML', NULL, 'INSERT INTO "ur_ingest_resource_path_match_rule" ("ur_ingest_resource_path_match_rule_id", "namespace", "regex", "flags", "nature", "priority", "description", "elaboration", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES (''ignore .git and node_modules paths'', ''default'', ''/(\.git|node_modules)/'', ''IGNORE_RESOURCE'', NULL, NULL, ''Ignore any entry with `/.git/` or `/node_modules/` in the path.'', NULL, (CURRENT_TIMESTAMP), NULL, NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET ur_ingest_resource_path_match_rule_id = COALESCE(EXCLUDED.ur_ingest_resource_path_match_rule_id, ur_ingest_resource_path_match_rule_id), namespace = COALESCE(EXCLUDED.namespace, namespace), regex = COALESCE(EXCLUDED.regex, regex), flags = COALESCE(EXCLUDED.flags, flags), description = COALESCE(EXCLUDED.description, description), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = ''current_user''); INSERT INTO "ur_ingest_resource_path_match_rule" ("ur_ingest_resource_path_match_rule_id", "namespace", "regex", "flags", "nature", "priority", "description", "elaboration", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES (''typical ingestion extensions'', ''default'', ''\.(?Pmd|mdx|html|json|jsonc|puml|txt|toml|yml|xml|tap|csv|tsv|ssv|psv|tm7|pdf|docx|doc|pptx|ppt|xlsx|xls)$'', ''CONTENT_ACQUIRABLE'', ''?P'', NULL, ''Ingest the content for md, mdx, html, json, jsonc, puml, txt, toml, and yml extensions. Assume the nature is the same as the extension.'', NULL, (CURRENT_TIMESTAMP), NULL, NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET ur_ingest_resource_path_match_rule_id = COALESCE(EXCLUDED.ur_ingest_resource_path_match_rule_id, ur_ingest_resource_path_match_rule_id), namespace = COALESCE(EXCLUDED.namespace, namespace), regex = COALESCE(EXCLUDED.regex, regex), flags = COALESCE(EXCLUDED.flags, flags), description = COALESCE(EXCLUDED.description, description), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = ''current_user''); INSERT INTO "ur_ingest_resource_path_match_rule" ("ur_ingest_resource_path_match_rule_id", "namespace", "regex", "flags", "nature", "priority", "description", "elaboration", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES (''surveilr-[NATURE] style capturable executable'', ''default'', ''surveilr\[(?P[^\]]*)\]'', ''CAPTURABLE_EXECUTABLE'', ''?P'', NULL, ''Any entry with `surveilr-[XYZ]` in the path will be treated as a capturable executable extracting `XYZ` as the nature'', NULL, (CURRENT_TIMESTAMP), NULL, NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET ur_ingest_resource_path_match_rule_id = COALESCE(EXCLUDED.ur_ingest_resource_path_match_rule_id, ur_ingest_resource_path_match_rule_id), namespace = COALESCE(EXCLUDED.namespace, namespace), regex = COALESCE(EXCLUDED.regex, regex), flags = COALESCE(EXCLUDED.flags, flags), description = COALESCE(EXCLUDED.description, description), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = ''current_user''); INSERT INTO "ur_ingest_resource_path_match_rule" ("ur_ingest_resource_path_match_rule_id", "namespace", "regex", "flags", "nature", "priority", "description", "elaboration", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES (''surveilr-SQL capturable executable'', ''default'', ''surveilr-SQL'', ''CAPTURABLE_EXECUTABLE | CAPTURABLE_SQL'', NULL, NULL, ''Any entry with surveilr-SQL in the path will be treated as a capturable SQL executable and allow execution of the SQL'', NULL, (CURRENT_TIMESTAMP), NULL, NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET ur_ingest_resource_path_match_rule_id = COALESCE(EXCLUDED.ur_ingest_resource_path_match_rule_id, ur_ingest_resource_path_match_rule_id), namespace = COALESCE(EXCLUDED.namespace, namespace), regex = COALESCE(EXCLUDED.regex, regex), flags = COALESCE(EXCLUDED.flags, flags), description = COALESCE(EXCLUDED.description, description), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = ''current_user''); @@ -1296,7 +1296,7 @@ INSERT INTO "party_type" ("code", "value", "created_at") VALUES (''PERSON'', ''P INSERT INTO "orchestration_nature" ("orchestration_nature_id", "nature", "elaboration", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES (''surveilr-transform-csv'', ''Transform CSV'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO NOTHING; INSERT INTO "orchestration_nature" ("orchestration_nature_id", "nature", "elaboration", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES (''surveilr-transform-xml'', ''Transform XML'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO NOTHING; INSERT INTO "orchestration_nature" ("orchestration_nature_id", "nature", "elaboration", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES (''surveilr-transform-html'', ''Transform HTML'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO NOTHING;', '1c6c81da95e5f34982d6ac95080d7c54cc09c869', NULL, NULL, (CURRENT_TIMESTAMP), (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'), NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET description = COALESCE(EXCLUDED.description, description), cell_governance = COALESCE(EXCLUDED.cell_governance, cell_governance), interpretable_code = COALESCE(EXCLUDED.interpretable_code, interpretable_code), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'); -INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB95PVT4Z8A7T4TJEC15GTDJ', 'SQL', 'ConstructionSqlNotebook', 'v002_fsContentIngestSessionFilesStatsViewDDL', NULL, 'DROP VIEW IF EXISTS "ur_ingest_session_files_stats"; +INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB9AH71FH5MXQXP73WNH92GF', 'SQL', 'ConstructionSqlNotebook', 'v002_fsContentIngestSessionFilesStatsViewDDL', NULL, 'DROP VIEW IF EXISTS "ur_ingest_session_files_stats"; CREATE VIEW IF NOT EXISTS "ur_ingest_session_files_stats" AS WITH Summary AS ( SELECT @@ -1355,7 +1355,7 @@ CREATE VIEW IF NOT EXISTS "ur_ingest_session_files_stats" AS device_id, ingest_session_finished_at, file_extension;', '9870d0c179334958ddda85827e4966b406c86e0c', NULL, NULL, (CURRENT_TIMESTAMP), (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'), NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET description = COALESCE(EXCLUDED.description, description), cell_governance = COALESCE(EXCLUDED.cell_governance, cell_governance), interpretable_code = COALESCE(EXCLUDED.interpretable_code, interpretable_code), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'); -INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB95PVT4HXRKCKR1RZENBV7X', 'SQL', 'ConstructionSqlNotebook', 'v002_fsContentIngestSessionFilesStatsLatestViewDDL', NULL, 'DROP VIEW IF EXISTS "ur_ingest_session_files_stats_latest"; +INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB9AH71F5GNNTZSQ8P0C52ZJ', 'SQL', 'ConstructionSqlNotebook', 'v002_fsContentIngestSessionFilesStatsLatestViewDDL', NULL, 'DROP VIEW IF EXISTS "ur_ingest_session_files_stats_latest"; CREATE VIEW IF NOT EXISTS "ur_ingest_session_files_stats_latest" AS SELECT iss.* FROM ur_ingest_session_files_stats AS iss @@ -1364,7 +1364,7 @@ CREATE VIEW IF NOT EXISTS "ur_ingest_session_files_stats_latest" AS ORDER BY ur_ingest_session.ingest_finished_at DESC LIMIT 1) AS latest ON iss.ingest_session_id = latest.latest_session_id;', 'f7a286b3b64881e069f05950d992a3b04af5c8f3', NULL, NULL, (CURRENT_TIMESTAMP), (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'), NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET description = COALESCE(EXCLUDED.description, description), cell_governance = COALESCE(EXCLUDED.cell_governance, cell_governance), interpretable_code = COALESCE(EXCLUDED.interpretable_code, interpretable_code), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'); -INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB95PVT4GFPRR21A0RZVNWG1', 'SQL', 'ConstructionSqlNotebook', 'v002_urIngestSessionTasksStatsViewDDL', NULL, 'DROP VIEW IF EXISTS "ur_ingest_session_tasks_stats"; +INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB9AH71FZ44NJ2A3TQ9VSC8E', 'SQL', 'ConstructionSqlNotebook', 'v002_urIngestSessionTasksStatsViewDDL', NULL, 'DROP VIEW IF EXISTS "ur_ingest_session_tasks_stats"; CREATE VIEW IF NOT EXISTS "ur_ingest_session_tasks_stats" AS WITH Summary AS ( SELECT @@ -1418,7 +1418,7 @@ CREATE VIEW IF NOT EXISTS "ur_ingest_session_tasks_stats" AS device_id, ingest_session_finished_at, ur_status;', '1f7a7f2e454cf81922df584750d84a4d39a2381e', NULL, NULL, (CURRENT_TIMESTAMP), (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'), NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET description = COALESCE(EXCLUDED.description, description), cell_governance = COALESCE(EXCLUDED.cell_governance, cell_governance), interpretable_code = COALESCE(EXCLUDED.interpretable_code, interpretable_code), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'); -INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB95PVT4X3MC8SG06TRB3YT5', 'SQL', 'ConstructionSqlNotebook', 'v002_urIngestSessionTasksStatsLatestViewDDL', NULL, 'DROP VIEW IF EXISTS "ur_ingest_session_tasks_stats_latest"; +INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB9AH71G41FJWHQZXWVYYR9Y', 'SQL', 'ConstructionSqlNotebook', 'v002_urIngestSessionTasksStatsLatestViewDDL', NULL, 'DROP VIEW IF EXISTS "ur_ingest_session_tasks_stats_latest"; CREATE VIEW IF NOT EXISTS "ur_ingest_session_tasks_stats_latest" AS SELECT iss.* FROM ur_ingest_session_tasks_stats AS iss @@ -1427,7 +1427,7 @@ CREATE VIEW IF NOT EXISTS "ur_ingest_session_tasks_stats_latest" AS ORDER BY ur_ingest_session.ingest_finished_at DESC LIMIT 1) AS latest ON iss.ingest_session_id = latest.latest_session_id;', '633501882d79e8bf255919bff540f9d0143489e3', NULL, NULL, (CURRENT_TIMESTAMP), (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'), NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET description = COALESCE(EXCLUDED.description, description), cell_governance = COALESCE(EXCLUDED.cell_governance, cell_governance), interpretable_code = COALESCE(EXCLUDED.interpretable_code, interpretable_code), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'); -INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB95PVT4P922SEVD9QPAV013', 'SQL', 'ConstructionSqlNotebook', 'v002_urIngestSessionFileIssueViewDDL', NULL, 'DROP VIEW IF EXISTS "ur_ingest_session_file_issue"; +INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB9AH71GZ6EK3GPGTDYQC0P5', 'SQL', 'ConstructionSqlNotebook', 'v002_urIngestSessionFileIssueViewDDL', NULL, 'DROP VIEW IF EXISTS "ur_ingest_session_file_issue"; CREATE VIEW IF NOT EXISTS "ur_ingest_session_file_issue" AS SELECT us.device_id, us.ur_ingest_session_id, @@ -1449,7 +1449,7 @@ CREATE VIEW IF NOT EXISTS "ur_ingest_session_file_issue" AS ufs.file_path_abs, ufs.ur_status, ufs.ur_diagnostics;', '99136e34dcf27424fa7b873b319ac5400786691e', NULL, NULL, (CURRENT_TIMESTAMP), (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'), NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET description = COALESCE(EXCLUDED.description, description), cell_governance = COALESCE(EXCLUDED.cell_governance, cell_governance), interpretable_code = COALESCE(EXCLUDED.interpretable_code, interpretable_code), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'); -INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB95PVT5ZZ9GT98S4P1C0076', 'AI LLM Prompt', 'rssd-init', 'understand notebooks schema', NULL, 'Understand the following structure of an SQLite database designed to store code notebooks and execution kernels. +INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB9AH71GYK1RR65FDBGDZ84W', 'AI LLM Prompt', 'rssd-init', 'understand notebooks schema', NULL, 'Understand the following structure of an SQLite database designed to store code notebooks and execution kernels. The database comprises three main tables: ''code_notebook_kernel'', ''code_notebook_cell'', and ''code_notebook_state''. 1. ''code_notebook_kernel'': A Notebook is a group of Cells. A kernel is a computational engine that executes the code contained in a notebook cell. @@ -1729,7 +1729,7 @@ CREATE VIEW IF NOT EXISTS "code_notebook_migration_sql" AS ON c.code_notebook_cell_id = s.code_notebook_cell_id AND s.to_state = ''EXECUTED'' ORDER BY c.cell_name;', 'c8ca408c48613bee7f576c69167610fdf54f6a13', NULL, NULL, (CURRENT_TIMESTAMP), (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'), NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET description = COALESCE(EXCLUDED.description, description), cell_governance = COALESCE(EXCLUDED.cell_governance, cell_governance), interpretable_code = COALESCE(EXCLUDED.interpretable_code, interpretable_code), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'); -INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB95PVT6XX5BEZK6SWSWCC39', 'AI LLM Prompt', 'rssd-init', 'understand service schema', NULL, 'Understand the following structure of an SQLite database designed to store cybersecurity and compliance data for files in a file system. +INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB9AH71H1TKJX4C6PV1XT0DQ', 'AI LLM Prompt', 'rssd-init', 'understand service schema', NULL, 'Understand the following structure of an SQLite database designed to store cybersecurity and compliance data for files in a file system. The database is designed to store devices in the ''device'' table and entities called ''resources'' stored in the immutable append-only ''uniform_resource'' table. Each time files are "walked" they are stored in ingestion session and link back to ''uniform_resource''. Because all tables are generally append only and immutable it means that the ingest_session_fs_path_entry table can be used for revision control @@ -2680,7 +2680,7 @@ CREATE VIEW IF NOT EXISTS "ur_ingest_session_file_issue" AS ufs.ur_status, ufs.ur_diagnostics; ', 'f166f333b6d2926ba05ae3bf615b35227242188a', NULL, NULL, (CURRENT_TIMESTAMP), (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'), NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET description = COALESCE(EXCLUDED.description, description), cell_governance = COALESCE(EXCLUDED.cell_governance, cell_governance), interpretable_code = COALESCE(EXCLUDED.interpretable_code, interpretable_code), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'); -INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB95PVT60GGXWYPH6BPPEE5X', 'Text Asset (.puml)', 'rssd-init', 'surveilr-code-notebooks-erd.auto.puml', NULL, '@startuml surveilr-code-notebooks +INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB9AH71HZBYFBS9M2AETYE9G', 'Text Asset (.puml)', 'rssd-init', 'surveilr-code-notebooks-erd.auto.puml', NULL, '@startuml surveilr-code-notebooks hide circle skinparam linetype ortho skinparam roundcorner 20 @@ -2742,7 +2742,7 @@ INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", code_notebook_kernel |o..o{ code_notebook_cell code_notebook_cell |o..o{ code_notebook_state @enduml', '84e0fc3aa026060b7e071785c89d02eaf87e6cbf', NULL, NULL, (CURRENT_TIMESTAMP), (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'), NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET description = COALESCE(EXCLUDED.description, description), cell_governance = COALESCE(EXCLUDED.cell_governance, cell_governance), interpretable_code = COALESCE(EXCLUDED.interpretable_code, interpretable_code), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'); -INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB95PVTAD8B9C13J0Q99ZR80', 'Text Asset (.puml)', 'rssd-init', 'surveilr-service-erd.auto.puml', NULL, '@startuml surveilr-state +INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB9AH71NZ7XWGSVGF2PBSJD4', 'Text Asset (.puml)', 'rssd-init', 'surveilr-service-erd.auto.puml', NULL, '@startuml surveilr-state hide circle skinparam linetype ortho skinparam roundcorner 20 @@ -3384,7 +3384,7 @@ INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", orchestration_session_issue |o..o{ orchestration_session_issue_relation orchestration_session_log |o..o{ orchestration_session_log @enduml', '4b969b52a269e847a64619c377d3fa61e7dd9796', NULL, NULL, (CURRENT_TIMESTAMP), (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'), NULL, NULL, NULL, NULL, NULL) ON CONFLICT DO UPDATE SET description = COALESCE(EXCLUDED.description, description), cell_governance = COALESCE(EXCLUDED.cell_governance, cell_governance), interpretable_code = COALESCE(EXCLUDED.interpretable_code, interpretable_code), "updated_at" = CURRENT_TIMESTAMP, "updated_by" = (SELECT "value" FROM "session_state_ephemeral" WHERE "key" = 'current_user'); -INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB95PVTC0GYDRFEXVKT3FRY6', 'Text Asset (.rs)', 'rssd-init', 'models_polygenix.rs', NULL, '/* +INSERT INTO "code_notebook_cell" ("code_notebook_cell_id", "notebook_kernel_id", "notebook_name", "cell_name", "cell_governance", "interpretable_code", "interpretable_code_hash", "description", "arguments", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by", "activity_log") VALUES ('01JB9AH71P8BETG3QRNGFSRWD7', 'Text Asset (.rs)', 'rssd-init', 'models_polygenix.rs', NULL, '/* const PARTY_TYPE: &str = "party_type"; const PARTY: &str = "party"; const PARTY_RELATION_TYPE: &str = "party_relation_type"; diff --git a/pattern/content-assembler/index.html b/pattern/content-assembler/index.html index 8540e1854..0691f34ac 100644 --- a/pattern/content-assembler/index.html +++ b/pattern/content-assembler/index.html @@ -249,8 +249,8 @@ }); }); }); -

The Content Assembler Pattern is a comprehensive content curation, assembly, and distribution platform designed for marketing, SEO, and content automation. +

The Content Assembler Pattern is a comprehensive content curation, assembly, and distribution platform designed for marketing, SEO, and content automation.

Content Assembler

Content curation, assembly, and distribution platform

Content Assembler Pattern Workflow

Content Assembler Pattern

Content Assembler Pattern provides a powerful, flexible framework for aggregating, curating, and distributing content across multiple platforms, with advanced SEO optimization and marketing automation integration. Suitable for businesses of any size looking to scale their content marketing efforts while maximizing audience engagement and traffic. It provides powerful tools to gather, organize, and distribute content across multiple platforms, while maximizing SEO benefits and audience engagement.

Use the SQL

Content Assembly & Curation

Automatic content assembly from multiple sources and media types

RSS Feed Management

Sourcing from RSS and social media feeds such as X / Twitter

Automated Email Newsletter Ingestion

Email Newsletter import from designated mailboxes

\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/pattern/content-assembler/index.html.br b/pattern/content-assembler/index.html.br index 7b70ac2e8..cacd11d0a 100644 Binary files a/pattern/content-assembler/index.html.br and b/pattern/content-assembler/index.html.br differ diff --git a/pattern/direct-messaging-service/index.html b/pattern/direct-messaging-service/index.html index 5aed357fd..009770cc2 100644 --- a/pattern/direct-messaging-service/index.html +++ b/pattern/direct-messaging-service/index.html @@ -249,11 +249,11 @@ }); }); }); -

The Direct Secure Messaging Service Pattern for surveilr ingests clinical data CCDA XML files and allows querying, summarizing episodes of care and exploration of those files. +

The Direct Secure Messaging Service Pattern for surveilr ingests clinical data CCDA XML files and allows querying, summarizing episodes of care and exploration of those files.

Direct Secure Messaging Service

Trusted and protected health information exchange is backed by the Direct Standard®

Direct Secure Messaging Service

Direct Secure Messaging Service

This pattern is designed to facilitate the secure exchange of clinical data using the phiMail service. It consists of four main modules, each serving a distinct purpose within the overall system. These modules work together to securely and efficiently send, receive, process, and analyze clinical messages. PhiMail is a secure messaging service that facilitates the exchange of protected health information (PHI) in compliance with healthcare regulations like HIPAA. It is designed to support healthcare providers, organizations, and other stakeholders in securely transmitting health-related data, ensuring both privacy and integrity.

Use the SQL

Compliance with HIPAA

PhiMail ensures that all communications involving PHI meet the stringent requirements of the Health Insurance Portability and Accountability Act (HIPAA). This includes encryption of data in transit, secure storage, and proper handling of sensitive information.

DIRECT Protocol Support

PhiMail is built on the DIRECT protocol, a standardized method for secure email communication in healthcare. This enables seamless and secure transmission of health information between different systems and organizations, such as hospitals, laboratories, and physician offices.

Encryption and Security

PhiMail utilizes robust encryption mechanisms to protect data, ensuring that only authorized parties can access the information. This includes the use of SSL/TLS for secure connections and digital signatures to verify the authenticity of messages.

Interoperability

PhiMail supports interoperability with various healthcare systems, enabling the exchange of data in different formats like CDA (Clinical Document Architecture). This allows for smooth integration with electronic health records (EHR) systems and other health information exchanges (HIEs).

\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/pattern/direct-messaging-service/index.html.br b/pattern/direct-messaging-service/index.html.br index 13fa533f8..3b66f778b 100644 Binary files a/pattern/direct-messaging-service/index.html.br and b/pattern/direct-messaging-service/index.html.br differ diff --git a/pattern/fhir-explorer/index.html b/pattern/fhir-explorer/index.html index bd22abf44..1cb508560 100644 --- a/pattern/fhir-explorer/index.html +++ b/pattern/fhir-explorer/index.html @@ -249,8 +249,8 @@ }); }); }); -

The FHIR Explorer Pattern for surveilr ingests healthcare FHIR JSON files and allows querying, quality metrics, and exploration of those files. +

The FHIR Explorer Pattern for surveilr ingests healthcare FHIR JSON files and allows querying, quality metrics, and exploration of those files.

FHIR Explorer

HL7 FHIR Content Aggregator and Explorer

FHIR Explorer

HL7 FHIR Content Aggregator and Explorer

The FHIR Explorer Pattern for surveilr ingests healthcare FHIR JSON files and allows querying, quality metrics, and exploration of those files. surveilr ingests healthcare FHIR data (represented as JSON files), stores it securely in a local SQL database, prepares SQL views for convenient querying, generates metrics of the FHIR content, and has an easy to use Web UI with options to filter, search, and visualize various healthcare records.

Use the SQL

Explore FHIR data

Easily search, filter, and interact with healthcare records in FHIR format.

Quality Assurance

Ensure FHIR data meets your organization's standards with built-in checks.

Visualize insights

Quickly analyze healthcare records with intuitive tools and data quality and compliance with real-time metrics and reporting.

\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/pattern/fhir-explorer/index.html.br b/pattern/fhir-explorer/index.html.br index c8e078e3b..0285d9722 100644 Binary files a/pattern/fhir-explorer/index.html.br and b/pattern/fhir-explorer/index.html.br differ diff --git a/pattern/index.html b/pattern/index.html index 8de09685d..e8453327c 100644 --- a/pattern/index.html +++ b/pattern/index.html @@ -249,8 +249,8 @@ }); }); }); -

Patterns

Patterns

Customer Stories GitHub Code for Public Patterns
FHIR Explorer
HL7 FHIR Content Aggregator and Explorer
Content Assembler Pattern Workflow
Content curation, assembly, and distribution platform
Mockup boxes of a tap bolts and nuts set
Team-based reading assignment and content collaboration solution
osQuery Integration Pattern
Surface surveilr RSSD tables via osQuery
Direct Secure Messaging Service
Trusted and protected health information exchange is backed by the Direct Standard®
Mockup of floating boxes

Why use surveilr patterns?

Don't rely on humans for evidence, use surveilr patterns to help acquire, collect, integrate, and query evidence in a secure warehouse.

  • Robust and reliable solutions that securely run in your environment.
  • Innovative solutions tailored to modern compliance needs.
  • Customer support dedicated to your project's success.

What Our Customers Say

"Since implementing surveilr and its FHIR Explorer Pattern, we’ve drastically reduced the time it takes to audit our healthcare data. The ability to query and explore FHIR files without needing a technical team has been a game-changer for us. We can now ensure compliance and data accuracy with minimal effort."

Image Description

Dr. Emily Harper

Chief Medical Information Officer | Medisync Health Systems

"As a financial services company, maintaining regulatory compliance across multiple systems was a major challenge. With surveilr, we now have a streamlined solution that provides automated compliance reports, auditable evidence, and real-time insights, all while minimizing our need for IT support."

Image Description

James Chen

Compliance Director | Argent Financial Solutions

"Our cybersecurity team has benefited immensely from using surveilr to monitor and audit our security logs. The automatic generation of machine-attestable evidence has not only improved our compliance efforts but also helped us quickly respond to incidents with confidence."

Image Description

Richard Kim

Chief Information Security Officer | NetSecure Technologies

\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/pattern/index.html.br b/pattern/index.html.br index 15185f33e..38638190b 100644 Binary files a/pattern/index.html.br and b/pattern/index.html.br differ diff --git a/pattern/lectio/index.html b/pattern/lectio/index.html index 629cb2499..832e3ab56 100644 --- a/pattern/lectio/index.html +++ b/pattern/lectio/index.html @@ -249,8 +249,8 @@ }); }); }); -

Netspective Lectio is a cutting-edge, team-based reading assignment and content collaboration solution designed to address these challenges. By integrating advanced tracking mechanisms, role-based content sharing, and continuous education tools, Lectio ensures that knowledge is not only shared but also understood and acted upon. +

Netspective Lectio is a cutting-edge, team-based reading assignment and content collaboration solution designed to address these challenges. By integrating advanced tracking mechanisms, role-based content sharing, and continuous education tools, Lectio ensures that knowledge is not only shared but also understood and acted upon.

Netspective Lectio

Team-based reading assignment and content collaboration solution

Mockup boxes of a tap bolts and nuts set

Netspective Lectio

In today’s rapidly evolving business landscape, the ability to efficiently disseminate, retain, and apply knowledge is more critical than ever. However, traditional methods of sharing knowledge—such as emailing links, PDFs, or other resources—are often ineffective, particularly in B2B environments where roles, disciplines, and subject areas vary widely. Netspective Lectio is a cutting-edge, team-based reading assignment and content collaboration solution designed to address these challenges. By integrating advanced tracking mechanisms, role-based content sharing, and continuous education tools, Lectio ensures that knowledge is not only shared but also understood and acted upon.

Use the SQL

Team-based

Netspective Lectio is designed to revolutionize team-based knowledge sharing and collaboration by addressing the inefficiencies of traditional methods. By offering robust tools for creating, tracking, and applying knowledge, Lectio ensures that organizations can keep pace with the growing demands of knowledge management.

Comprehensive data aggregation

The integration of surveilr within Lectio’s architecture enhances its capabilities, allowing for comprehensive data aggregation and analysis across multiple sources. This data strategy, combined with advanced tracking mechanisms and role-based content sharing, positions Lectio as an essential tool for any organization looking to enhance its knowledge management processes.

Continuous education and effectiveness tracking

Lectio’s targeted approach—catering to specific roles, disciplines, and subject areas—ensures that knowledge is not only disseminated effectively but also applied in a way that drives tangible results. With a strong focus on continuous education and effectiveness tracking, Lectio is poised to become a cornerstone of modern knowledge management strategies.

\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/pattern/lectio/index.html.br b/pattern/lectio/index.html.br index d5e88ff47..7261525c4 100644 Binary files a/pattern/lectio/index.html.br and b/pattern/lectio/index.html.br differ diff --git a/pattern/osquery/index.html b/pattern/osquery/index.html index 8b84b677d..abd864017 100644 --- a/pattern/osquery/index.html +++ b/pattern/osquery/index.html @@ -249,8 +249,8 @@ }); }); }); -

The surveilr osQuery Integration Pattern provides a seamless method to integrate any surveilr-managed database into osQuery using the Automatic Table Construction (ATC) pattern. This allows organizations to query and analyze data from a variety of sources—collected and standardized within surveilr—via osQuery’s SQL interface. +

The surveilr osQuery Integration Pattern provides a seamless method to integrate any surveilr-managed database into osQuery using the Automatic Table Construction (ATC) pattern. This allows organizations to query and analyze data from a variety of sources—collected and standardized within surveilr—via osQuery’s SQL interface.

osQuery Integration Pattern

Surface surveilr RSSD tables via osQuery

osQuery Integration Pattern

osQuery Integration Pattern

By leveraging the ATC JSON pattern, users can automatically surface custom tables in osQuery to interact directly with the content stored in surveilr's Resource Surveillance State Database (RSSD). This enables osQuery to dynamically join data from multiple sources (emails, logs, compliance evidence, PLM/CRM systems, etc.), providing powerful querying capabilities for security audits, compliance reporting, and decision-making.

Use the SQL

Unified Data Access

The integration allows organizations to leverage surveilr as a universal data aggregator, pulling from a multitude of data sources. osQuery users benefit from this by gaining a unified interface to query all of the data—regardless of where it originally came from—using standard SQL.

Edge-Based Security

Since surveilr employs a local-first, edge-based approach, sensitive data is handled securely at the source, before it is ever integrated into the central system or osQuery tables. This enhances data security by reducing the risks associated with transferring sensitive information over networks.

Seamless Extensibility with ATC

The Automatic Table Construction (ATC) pattern simplifies extending osQuery’s capabilities. No need to write complex C++ extensions or plugins. Instead, users define custom tables in JSON format, making it easy to add new data sources or modify the structure of the tables without redeploying osQuery.

\ No newline at end of file + 🕰️ Publication created Oct 28 2024, 10:24 AM.

\ No newline at end of file diff --git a/pattern/osquery/index.html.br b/pattern/osquery/index.html.br index 06ed231ea..e912563c2 100644 Binary files a/pattern/osquery/index.html.br and b/pattern/osquery/index.html.br differ diff --git a/services/index.html b/services/index.html index 87298ae53..10779fdd1 100644 --- a/services/index.html +++ b/services/index.html @@ -249,6 +249,6 @@ }); }); }); -

Professional Services for Mission-Critical Use Cases

We understand that organizations dealing with regulatory compliance, security, and mission-critical or safety-critical use cases need a reliable and flexible platform. That’s why surveilr is designed to be fully self-service, requiring minimal technical knowledge and little to no support from your IT team. However, when you do need help, we’re here to assist you every step of the way.

Construction site before and after

Free Best-Effort Support via GitHub Help Desk

Our free support service is available to all users via the GitHub Help Desk. This includes best-effort support for general questions, troubleshooting, and assistance with surveilr. A collaborative community where you can ask questions, get advice, and share experiences with other surveilr users is ready to help.

Access the Help Desk

Paid Support with SLAs: Monthly or Annual Maintenance

For organizations that need priority support or more dedicated assistance, we offer paid support plans. Email and phone support for for timely assistance with your specific needs. We offer support with Service Level Agreements (SLAs) that include guaranteed response times, ensuring your issues are addressed promptly, especially in mission-critical scenarios.

Construction workers orchestrating a project Aerial view of managed construction
Man in orange and black vest wearing white helmet holding yellow and black power tool

Custom Professional Services

For organizations with unique use cases, custom compliance requirements, or those needing specialized features, we offer tailored professional services. We can develop specific Industry or Discipline Patterns that cater to your exact needs, whether it’s integrating a specific regulatory framework or creating custom reporting tools. Need more than what’s available in our out-of-the-box solutions? We offer bespoke development to extend surveilr to meet your organization’s exact specifications.

Why Choose Our Professional Services?

We have deep experience working with organizations that face regulatory hurdles, compliance audits, and security challenges. We understand the stakes and are equipped to provide solutions tailored to your environment. Whether you need occasional assistance or full, dedicated support, we offer flexible plans that fit your needs—ensuring your organization is never left without help when it’s needed most.

Talk to Us
In progress building structure Brown and gray building under construction
\ No newline at end of file diff --git a/services/index.html.br b/services/index.html.br index 3c475fda2..d7fd475f8 100644 Binary files a/services/index.html.br and b/services/index.html.br differ