diff --git a/404.html b/404.html index b70859387..ad3b5a6d4 100644 --- a/404.html +++ b/404.html @@ -244,11 +244,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.

Shahid Shah
Shahid N. Shah
  • Oct 11, 2024
  • 3 min read +
    Shahid Shah
    Shahid N. Shah
    • Oct 11, 2024
    • 3 min read

    Orchestration with JavaScript and Python

    Lightweight ETL

    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.

    @@ -304,4 +304,4 @@

    Conclusion

    Related articles
\ No newline at end of file + 🕰️ Publication created Oct 21 2024, 8:31 AM.

\ No newline at end of file diff --git a/blog/advanced-polyglot-orchestration/index.html.br b/blog/advanced-polyglot-orchestration/index.html.br index 1e24e478a..80aa0a279 100644 Binary files a/blog/advanced-polyglot-orchestration/index.html.br and b/blog/advanced-polyglot-orchestration/index.html.br differ diff --git a/blog/direct-messaging-service-pattern/index.html b/blog/direct-messaging-service-pattern/index.html index c31565146..c72e0e9eb 100644 --- a/blog/direct-messaging-service-pattern/index.html +++ b/blog/direct-messaging-service-pattern/index.html @@ -245,7 +245,7 @@ }); }); }); -
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.

    @@ -337,4 +337,4 @@

    Conclusion

    Related articles
\ No newline at end of file + 🕰️ Publication created Oct 21 2024, 8:31 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 9a1217a37..147ac657f 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 962693e71..3174735dd 100644 --- a/blog/evidence-based-decision-making-pattern/index.html +++ b/blog/evidence-based-decision-making-pattern/index.html @@ -245,7 +245,7 @@ }); }); }); -
Avatar Description
Shahid N. Shah
\ No newline at end of file + 🕰️ Publication created Oct 21 2024, 8:31 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 92e35435a..d46f3eea7 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 6f16b00f5..ac59e93b4 100644 --- a/blog/index.html +++ b/blog/index.html @@ -244,7 +244,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 21 2024, 8:31 AM.

\ No newline at end of file diff --git a/blog/index.html.br b/blog/index.html.br index 081414b7f..d7bbe94db 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 f14984ef9..c07240959 100644 --- a/blog/power-of-sql-and-sql-views/index.html +++ b/blog/power-of-sql-and-sql-views/index.html @@ -245,7 +245,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.

    @@ -307,4 +307,4 @@

    Conclusion

    Related articles
\ No newline at end of file + 🕰️ Publication created Oct 21 2024, 8:31 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 07e4ca40e..19e44252f 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 cd0960dfb..87ef82c25 100644 --- a/blog/quality-management-pattern/index.html +++ b/blog/quality-management-pattern/index.html @@ -245,7 +245,7 @@ }); }); }); -
Avatar Description
Shahid N. Shah
\ No newline at end of file + 🕰️ Publication created Oct 21 2024, 8:31 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 e3bbf11bb..73b03e28b 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 b2d01d1a7..27a6a0223 100644 --- a/blog/rssd-excel-portability-sql-power/index.html +++ b/blog/rssd-excel-portability-sql-power/index.html @@ -245,7 +245,7 @@ }); }); }); -
Avatar Description
Shahid N. Shah
\ No newline at end of file + 🕰️ Publication created Oct 21 2024, 8:31 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 bd9345486..ce582e846 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 a90f99ba6..0615be024 100644 --- a/blog/sql-based-etl-elt/index.html +++ b/blog/sql-based-etl-elt/index.html @@ -245,7 +245,7 @@ }); }); }); -
Shahid Shah
Shahid N. Shah
\ No newline at end of file + 🕰️ Publication created Oct 21 2024, 8:31 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 3c9941b3f..68692efca 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 8cdcfdc87..f365cf836 100644 --- a/blog/surveilr-core-vs-patterns/index.html +++ b/blog/surveilr-core-vs-patterns/index.html @@ -245,7 +245,7 @@ }); }); }); -
Shahid Shah
Shahid N. Shah
\ No newline at end of file + 🕰️ Publication created Oct 21 2024, 8:31 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 914911de1..e85b7edad 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 8e6f503e6..0506abcbd 100644 --- a/blog/surveilr-integration-engine/index.html +++ b/blog/surveilr-integration-engine/index.html @@ -245,7 +245,7 @@ }); }); }); -
Avatar Description
Pradeep Narayanan
\ No newline at end of file + 🕰️ Publication created Oct 21 2024, 8:31 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 a9b35f743..50c81b93b 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 a3a094f5e..cf3ecb3a0 100644 --- a/blog/vendor-assessments/index.html +++ b/blog/vendor-assessments/index.html @@ -245,7 +245,7 @@ }); }); }); -
Shahid N. Shah
Shahid N. Shah
\ No newline at end of file + 🕰️ Publication created Oct 21 2024, 8:31 AM.

\ No newline at end of file diff --git a/blog/vendor-assessments/index.html.br b/blog/vendor-assessments/index.html.br index db57e6077..9587cba0e 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 9195b062f..613911e1b 100644 --- a/blog/why-stateful-integration/index.html +++ b/blog/why-stateful-integration/index.html @@ -245,7 +245,7 @@ }); }); }); -
Avatar Description
Shahid N. Shah
\ No newline at end of file + 🕰️ Publication created Oct 21 2024, 8:31 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 ddc56c77b..5264e03af 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 ec731c5ef..84d074df3 100644 --- a/contact/index.html +++ b/contact/index.html @@ -244,7 +244,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 21 2024, 8:31 AM.

\ No newline at end of file diff --git a/contact/index.html.br b/contact/index.html.br index 4161d73ba..bcc70df19 100644 Binary files a/contact/index.html.br and b/contact/index.html.br differ diff --git a/index.html b/index.html index def2a6b25..909caae6c 100644 --- a/index.html +++ b/index.html @@ -245,10 +245,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 versatile and can be used across industries such as healthcare, finance, energy, manufacturing, aerospace, and cybersecurity. It is especially valuable in industries that are highly regulated and require consistent tracking of compliance, quality, and security.

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

surveilr Patterns are pre-built SQL Packages designed for different industries, disciplines, and use cases. They provide out-of-the-box functionality for specific business needs, such as compliance reporting, security monitoring, or quality assurance. These Patterns can be combined and customized to create a self-contained service or solution for your organization’s exact requirements.

Let's Build Together

Ready to start using the Resource Surveillance and Integration Engine?

\ No newline at end of file + 🕰️ Publication created Oct 21 2024, 8:31 AM.

\ No newline at end of file diff --git a/index.html.br b/index.html.br index 7dd8abf56..6d0928c3b 100644 Binary files a/index.html.br and b/index.html.br differ diff --git a/insights/insight-1/index.html b/insights/insight-1/index.html index 7c77228e9..b5e958dc4 100644 --- a/insights/insight-1/index.html +++ b/insights/insight-1/index.html @@ -245,7 +245,7 @@ }); }); }); -
Top view mechanical tools arrangement
\ No newline at end of file + 🕰️ Publication created Oct 21 2024, 8:31 AM.

\ No newline at end of file diff --git a/insights/insight-1/index.html.br b/insights/insight-1/index.html.br index 0346d6c4b..825afda98 100644 Binary files a/insights/insight-1/index.html.br and b/insights/insight-1/index.html.br differ diff --git a/insights/insight-2/index.html b/insights/insight-2/index.html index e2739a4d4..452d36298 100644 --- a/insights/insight-2/index.html +++ b/insights/insight-2/index.html @@ -245,7 +245,7 @@ }); }); }); -
Top view mechanical tools arrangement
\ No newline at end of file + 🕰️ Publication created Oct 21 2024, 8:31 AM.

\ No newline at end of file diff --git a/insights/insight-2/index.html.br b/insights/insight-2/index.html.br index b81f045af..866178297 100644 Binary files a/insights/insight-2/index.html.br and b/insights/insight-2/index.html.br differ diff --git a/insights/insight-3/index.html b/insights/insight-3/index.html index fab138fb7..fdecf2be0 100644 --- a/insights/insight-3/index.html +++ b/insights/insight-3/index.html @@ -245,7 +245,7 @@ }); }); }); -
Top view mechanical tools arrangement
\ No newline at end of file + 🕰️ Publication created Oct 21 2024, 8:31 AM.

\ No newline at end of file diff --git a/insights/insight-3/index.html.br b/insights/insight-3/index.html.br index 4fd3cd8f6..5022d76c3 100644 Binary files a/insights/insight-3/index.html.br and b/insights/insight-3/index.html.br differ diff --git a/insights/why-sqlite-for-rssd/index.html b/insights/why-sqlite-for-rssd/index.html index 468880924..9f242b327 100644 --- a/insights/why-sqlite-for-rssd/index.html +++ b/insights/why-sqlite-for-rssd/index.html @@ -245,7 +245,7 @@ }); }); }); -
SQLite versatility
\ No newline at end of file + 🕰️ Publication created Oct 21 2024, 8:31 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 96f9345db..cc39903c8 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/lib/service/diabetes-research-hub/drhctl.ts b/lib/service/diabetes-research-hub/drhctl.ts index f26cfaebb..775683da4 100644 --- a/lib/service/diabetes-research-hub/drhctl.ts +++ b/lib/service/diabetes-research-hub/drhctl.ts @@ -19,6 +19,7 @@ const dbFilePath = "resource-surveillance.sqlite.db"; // Path to your SQLite DB const RSC_BASE_URL = "https://raw.githubusercontent.com/surveilr/www.surveilr.com/main/lib/service/diabetes-research-hub"; const UX_URL = "https://www.surveilr.com/lib/service/diabetes-research-hub"; +//const UX_URL = "http://localhost:4321/lib/service/diabetes-research-hub"; @@ -225,21 +226,17 @@ try { } -// This function retrieves the SQL script for data de-identification. -// Note: Deidentification functions are only available through the `surveilr shell` or `surveilr orchestrate` commands. -// Issues prevail while executing these commands on Windows OS. -// Therefore avoiding deidentification till the issue is resolved -// try { -// console.log(colors.dim(`Performing DeIdentification: ${folderName}...`)); -// await executeCommand( -// [toolCmd, "orchestrate", "-n", "deidentification"], -// deidentificationSQLSupplier, -// ); -// console.log(colors.green("Deidentification successful.")); -// } catch (error) { -// console.error(colors.cyan("Error during DeIdentification:"), error.message); -// //Deno.exit(1); -// } +try { + console.log(colors.dim(`Performing DeIdentification: ${folderName}...`)); + await executeCommand( + [toolCmd, "orchestrate", "-n", "deidentification"], + deidentificationSQLSupplier, + ); + console.log(colors.green("Deidentification successful.")); +} catch (error) { + console.error(colors.cyan("Error during DeIdentification:"), error.message); + //Deno.exit(1); +} // This function is for the dynamic combined view generation // try { @@ -252,8 +249,8 @@ try { try { console.log(colors.dim(`Performing UX orchestration: ${folderName}...`)); - //await executeCommand([toolCmd, "shell"], uxSQLSupplier); - executeSqlCommands(uxSQL); // Execute UX SQL commands + await executeCommand([toolCmd, "shell"], uxSQLSupplier); + //executeSqlCommands(uxSQL); // Execute UX SQL commands console.log(colors.green("UX orchestration completed successfully.")); } catch (error) { console.error(colors.cyan("Error during UX orchestration:"), error.message); diff --git a/lib/service/diabetes-research-hub/package.sql.ts b/lib/service/diabetes-research-hub/package.sql.ts index a08a6a22c..4a8c2165d 100644 --- a/lib/service/diabetes-research-hub/package.sql.ts +++ b/lib/service/diabetes-research-hub/package.sql.ts @@ -1,4 +1,4 @@ -#!/usr/bin/env -S deno run --allow-read --allow-write --allow-env --allow-run --allow-sys +#!/usr/bin/env -S deno run --allow-read --allow-write --allow-env --allow-run --allow-sys --allow-ffi import { sqlPageNB as spn } from "./deps.ts"; import { console as c, @@ -8,6 +8,7 @@ import { } from "../../std/web-ui-content/mod.ts"; import * as sppn from "../..//std/notebook/sqlpage.ts"; +import { createUVACombinedCGMViewSQL,generateDetrendedDSCombinedCGMViewSQL } from './study-specific-stateless/generate-cgm-combined-sql.ts'; // custom decorator that makes navigation for this notebook type-safe function drhNav(route: Omit) { @@ -154,6 +155,15 @@ export class DRHSqlPages extends spn.TypicalSqlPageNotebook { `; } + combinedViewDDL() + { + const dbFilePath = "./resource-surveillance.sqlite.db"; + const sqlStatements= createUVACombinedCGMViewSQL(dbFilePath); + return this.SQL` + ${sqlStatements} + `; + } + @spn.navigationPrimeTopLevel({ caption: "DRH EDGE UI Home", description: "Welcome to Diabetes Research Hub EDGE UI", @@ -204,7 +214,7 @@ export class DRHSqlPages extends spn.TypicalSqlPageNotebook { SELECT 'card' as component, 'Features ' as title, - 8 as columns; + 9 as columns; SELECT @@ -269,6 +279,13 @@ export class DRHSqlPages extends spn.TypicalSqlPageNotebook { '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 'PHI De-Identification Results' AS title, @@ -501,6 +518,51 @@ This section provides information about the publications resulting from a study. `; } + + @drhNav({ + caption: "Combined CGM Tracing", + abbreviatedCaption: "Combined CGM Tracing", + description: "Combined CGM Tracing", + siblingOrder: 21, + }) + "drh/cgm-combined-data/index.sql"() { + const viewName = `combined_cgm_tracing`; + const pagination = this.pagination({ tableOrViewName: viewName }); + return this.SQL` + ${this.activePageTitle()} + + + SELECT +'text' as component, +' + +The **Combined CGM Tracing** refers to a consolidated dataset of continuous glucose monitoring (CGM) data, collected from multiple participants in a research study. CGM devices track glucose levels at regular intervals throughout the day, providing detailed insights into the participants'' glycemic control over time. + +In a research study, this combined dataset is crucial for analyzing glucose trends across different participants and understanding overall patterns in response to interventions or treatments. The **Combined CGM Tracing** dataset typically includes: +- **Participant ID**: A unique identifier for each participant, ensuring the data is de-identified while allowing for tracking individual responses. +- **Date_Time**: The timestamp for each CGM reading, formatted uniformly to allow accurate time-based analysis.(YYYY-MM-DD HH:MM:SS) +- **CGM_Value**: The recorded glucose level at each time point, often converted to a standard unit (e.g., mg/dL or mmol/L) and stored as a real number for precise calculations. + +This combined view enables researchers to perform comparative analyses, evaluate glycemic variability, and assess overall glycemic control across participants, which is essential for understanding the efficacy of treatments or interventions in the study. By aggregating data from multiple sources, researchers can identify population-level trends while maintaining the integrity of individual data. + +' as contents_md; + +${pagination.init()} + +-- Display uniform_resource table with pagination +SELECT 'table' AS component, + TRUE AS sort, + TRUE AS search; +SELECT * FROM ${viewName} +LIMIT $limit +OFFSET $offset; + +${pagination.renderSimpleMarkdown()} + + `; + } + + @drhNav({ caption: "CGM File MetaData Information", abbreviatedCaption: "CGM File MetaData Information", @@ -1038,19 +1100,8 @@ Participants are individuals who volunteer to take part in CGM research studies. export async function drhSQL() { return await spn.TypicalSqlPageNotebook.SQL( - new class extends spn.TypicalSqlPageNotebook { - + new class extends spn.TypicalSqlPageNotebook { - // async deidentifyDRHSQL() { - // // This function retrieves the SQL script for data de-identification. - // // Note: Deidentification functions are only available through the `surveilr shell` or `surveilr orchestrate` commands. - // // Issues prevail while executing these commands on Windows OS. - // return await spn.TypicalSqlPageNotebook.fetchText( - // import.meta.resolve( - // "./orchestration/deidentification-orchestration.sql", - // ), - // ); - // } async vandvDRHSQL() { // This function retrieves the SQL script for verfication and validation 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 new file mode 100644 index 000000000..cc5f04273 --- /dev/null +++ b/lib/service/diabetes-research-hub/study-specific-stateless/generate-cgm-combined-sql.ts @@ -0,0 +1,133 @@ +#!/usr/bin/env -S deno run --allow-read --allow-write --allow-env --allow-run --allow-net + +import { Database } from "https://deno.land/x/sqlite3@0.12.0/mod.ts"; + +// Common function to log errors into the database +function logError(db: Database, errorMessage: string): void { + db.exec(`CREATE TABLE IF NOT EXISTS error_log ( + errorLogId INTEGER PRIMARY KEY AUTOINCREMENT, + datetime TEXT DEFAULT (datetime('now')), + error_message TEXT + );`); + + const params = JSON.stringify({ message: errorMessage }); + db.prepare("INSERT INTO error_log (error_message) VALUES (?);").run(params); +} + +// Function to create the initial view and return SQL for combined CGM tracing view (first dataset) +export function createUVACombinedCGMViewSQL(dbFilePath: string): string { + const db = new Database(dbFilePath); + + try { + // Execute the initial view + db.exec(`DROP VIEW IF EXISTS drh_participant_file_names;`); + db.exec(` + CREATE VIEW drh_participant_file_names AS + SELECT patient_id, GROUP_CONCAT(file_name, ', ') AS file_names + FROM uniform_resource_cgm_file_metadata + GROUP BY patient_id; + `); + //console.log("View 'drh_participant_file_names' created successfully."); + } catch (error) { + //console.error("Error creating view 'drh_participant_file_names':", error); + logError(db, error.message); + db.close(); + return ""; + } + + const participantsStmt = db.prepare("SELECT DISTINCT patient_id FROM drh_participant_file_names;"); + const participants = participantsStmt.all(); + + const sqlParts: string[] = []; + for (const { patient_id } of participants) { + const fileNamesStmt = db.prepare("SELECT file_names FROM drh_participant_file_names WHERE patient_id = ?;"); + const file_names_row = fileNamesStmt.get(patient_id); + + if (!file_names_row) { + //console.log(`No file names found for participant ${patient_id}.`); + continue; + } + + const file_names = file_names_row.file_names; + if (file_names) { + const participantTableNames = file_names.split(', ').map(fileName => `uniform_resource_${fileName}`); + participantTableNames.forEach(tableName => { + sqlParts.push(` + SELECT + '${patient_id}' as participant_id, + strftime('%Y-%m-%d %H:%M:%S', date_time) as Date_Time, + CAST(CGM_Value as REAL) as CGM_Value + FROM ${tableName} + `); + }); + } + fileNamesStmt.finalize(); + } + + let combinedViewSQL = ''; + if (sqlParts.length > 0) { + const combinedUnionAllQuery = sqlParts.join(' UNION ALL '); + combinedViewSQL = `CREATE VIEW combined_cgm_tracing AS ${combinedUnionAllQuery};`; + } else { + //console.log("No participant tables found, so the combined view will not be created."); + } + + participantsStmt.finalize(); + db.close(); + + return combinedViewSQL; // Return the SQL string instead of executing it +} + +// Function to generate the combined CGM tracing view SQL for the second dataset +export function generateDetrendedDSCombinedCGMViewSQL(dbFilePath: string): string { + const db = new Database(dbFilePath); + + const tablesStmt = db.prepare("SELECT name AS table_name FROM sqlite_master WHERE type = 'table' AND name LIKE 'uniform_resource_case__%'"); + const tables = tablesStmt.all(); + const sqlParts: string[] = []; + + // Loop through each table and generate the SQL for their CGM data + for (const { table_name } of tables) { + const participantId = table_name.split('__').pop(); // Extract participant ID from the table name + + // Generate SQL for each participant's CGM data + sqlParts.push(` + SELECT + '${participantId}' AS participant_id, + TRIM('2012-01-01 ' || hora ) AS Date_Time, + CAST(glucemia AS REAL) AS CGM_Value + FROM ${table_name} + `); + } + + let combinedViewSQL = ''; + if (sqlParts.length > 0) { + const combinedUnionAllQuery = sqlParts.join(' UNION ALL '); + combinedViewSQL = `CREATE VIEW combined_cgm_tracing AS ${combinedUnionAllQuery};`; + } else { + //console.log("No participant tables found, so the combined view will not be created."); + } + + db.close(); + + return combinedViewSQL; // Return the SQL string instead of executing it +} + +// If the script is being run directly, execute the functions +if (import.meta.main) { + const dbFilePath = "resource-surveillance.sqlite.db"; + + // Run the first dataset view creation and get the SQL for combined view + const dclp1combinedCGMViewSQL= createUVACombinedCGMViewSQL(dbFilePath); + if (dclp1combinedCGMViewSQL) { + console.log("Generated SQL for DCLP1 Study dataset:"); + console.log(dclp1combinedCGMViewSQL); + } + + // Generate and log the SQL for the second dataset + const detrendedDSCombinedCGMViewSQL = generateDetrendedDSCombinedCGMViewSQL(dbFilePath); + if (detrendedDSCombinedCGMViewSQL) { + console.log("Generated SQL for detrended fluctuation analysis dataset:"); + console.log(detrendedDSCombinedCGMViewSQL); + } +} diff --git a/pagefind/fragment/en_8a399bd.pf_fragment b/pagefind/fragment/en_12f2023.pf_fragment similarity index 77% rename from pagefind/fragment/en_8a399bd.pf_fragment rename to pagefind/fragment/en_12f2023.pf_fragment index c9178f916..c4ffb8c43 100644 Binary files a/pagefind/fragment/en_8a399bd.pf_fragment and b/pagefind/fragment/en_12f2023.pf_fragment differ diff --git a/pagefind/fragment/en_149f28a.pf_fragment b/pagefind/fragment/en_149f28a.pf_fragment new file mode 100644 index 000000000..77998799a Binary files /dev/null and b/pagefind/fragment/en_149f28a.pf_fragment differ diff --git a/pagefind/fragment/en_cd36475.pf_fragment b/pagefind/fragment/en_14ed931.pf_fragment similarity index 83% rename from pagefind/fragment/en_cd36475.pf_fragment rename to pagefind/fragment/en_14ed931.pf_fragment index 6e78e5186..77ec5099c 100644 Binary files a/pagefind/fragment/en_cd36475.pf_fragment and b/pagefind/fragment/en_14ed931.pf_fragment differ diff --git a/pagefind/fragment/en_3a814c6.pf_fragment b/pagefind/fragment/en_1e59c06.pf_fragment similarity index 81% rename from pagefind/fragment/en_3a814c6.pf_fragment rename to pagefind/fragment/en_1e59c06.pf_fragment index 184f9d2c9..52e76cc94 100644 Binary files a/pagefind/fragment/en_3a814c6.pf_fragment and b/pagefind/fragment/en_1e59c06.pf_fragment differ diff --git a/pagefind/fragment/en_20265ea.pf_fragment b/pagefind/fragment/en_20265ea.pf_fragment deleted file mode 100644 index 79e609f7e..000000000 Binary files a/pagefind/fragment/en_20265ea.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_235cd67.pf_fragment b/pagefind/fragment/en_235cd67.pf_fragment deleted file mode 100644 index 494ffa7ac..000000000 Binary files a/pagefind/fragment/en_235cd67.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_ce6eefe.pf_fragment b/pagefind/fragment/en_239c349.pf_fragment similarity index 60% rename from pagefind/fragment/en_ce6eefe.pf_fragment rename to pagefind/fragment/en_239c349.pf_fragment index a6ad1d27f..34fe42ab9 100644 Binary files a/pagefind/fragment/en_ce6eefe.pf_fragment and b/pagefind/fragment/en_239c349.pf_fragment differ diff --git a/pagefind/fragment/en_24d36fb.pf_fragment b/pagefind/fragment/en_24d36fb.pf_fragment deleted file mode 100644 index b3b8f766c..000000000 Binary files a/pagefind/fragment/en_24d36fb.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_25d2e2d.pf_fragment b/pagefind/fragment/en_25d2e2d.pf_fragment new file mode 100644 index 000000000..a7fe7987f Binary files /dev/null and b/pagefind/fragment/en_25d2e2d.pf_fragment differ diff --git a/pagefind/fragment/en_294fe0b.pf_fragment b/pagefind/fragment/en_294fe0b.pf_fragment deleted file mode 100644 index 3480b6c19..000000000 Binary files a/pagefind/fragment/en_294fe0b.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_2b1255f.pf_fragment b/pagefind/fragment/en_2b1255f.pf_fragment new file mode 100644 index 000000000..ed974f83d Binary files /dev/null and b/pagefind/fragment/en_2b1255f.pf_fragment differ diff --git a/pagefind/fragment/en_2bb1578.pf_fragment b/pagefind/fragment/en_2bb1578.pf_fragment deleted file mode 100644 index 08c16c068..000000000 Binary files a/pagefind/fragment/en_2bb1578.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_2022868.pf_fragment b/pagefind/fragment/en_2eb6099.pf_fragment similarity index 81% rename from pagefind/fragment/en_2022868.pf_fragment rename to pagefind/fragment/en_2eb6099.pf_fragment index ac36b31e7..0b36eb6ff 100644 Binary files a/pagefind/fragment/en_2022868.pf_fragment and b/pagefind/fragment/en_2eb6099.pf_fragment differ diff --git a/pagefind/fragment/en_35139ef.pf_fragment b/pagefind/fragment/en_35139ef.pf_fragment new file mode 100644 index 000000000..ecb3cfb9e Binary files /dev/null and b/pagefind/fragment/en_35139ef.pf_fragment differ diff --git a/pagefind/fragment/en_3814cac.pf_fragment b/pagefind/fragment/en_3814cac.pf_fragment deleted file mode 100644 index 8df0bb13c..000000000 Binary files a/pagefind/fragment/en_3814cac.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_38e4748.pf_fragment b/pagefind/fragment/en_38e4748.pf_fragment new file mode 100644 index 000000000..6925b9a76 Binary files /dev/null and b/pagefind/fragment/en_38e4748.pf_fragment differ diff --git a/pagefind/fragment/en_393076f.pf_fragment b/pagefind/fragment/en_393076f.pf_fragment deleted file mode 100644 index 68f0f0544..000000000 Binary files a/pagefind/fragment/en_393076f.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_3a49f67.pf_fragment b/pagefind/fragment/en_3a49f67.pf_fragment deleted file mode 100644 index 40744ffc9..000000000 Binary files a/pagefind/fragment/en_3a49f67.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_4012b68.pf_fragment b/pagefind/fragment/en_4012b68.pf_fragment new file mode 100644 index 000000000..b95862fbd Binary files /dev/null and b/pagefind/fragment/en_4012b68.pf_fragment differ diff --git a/pagefind/fragment/en_4195b99.pf_fragment b/pagefind/fragment/en_4195b99.pf_fragment deleted file mode 100644 index c373963db..000000000 Binary files a/pagefind/fragment/en_4195b99.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_41ccc9f.pf_fragment b/pagefind/fragment/en_41ccc9f.pf_fragment deleted file mode 100644 index 5d88a2a53..000000000 Binary files a/pagefind/fragment/en_41ccc9f.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_46429aa.pf_fragment b/pagefind/fragment/en_46429aa.pf_fragment new file mode 100644 index 000000000..752b464dd Binary files /dev/null and b/pagefind/fragment/en_46429aa.pf_fragment differ diff --git a/pagefind/fragment/en_4befc2a.pf_fragment b/pagefind/fragment/en_4befc2a.pf_fragment deleted file mode 100644 index 745089724..000000000 Binary files a/pagefind/fragment/en_4befc2a.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_49497a8.pf_fragment b/pagefind/fragment/en_4dbb28b.pf_fragment similarity index 76% rename from pagefind/fragment/en_49497a8.pf_fragment rename to pagefind/fragment/en_4dbb28b.pf_fragment index a9b4b8dc2..352cd9aeb 100644 Binary files a/pagefind/fragment/en_49497a8.pf_fragment and b/pagefind/fragment/en_4dbb28b.pf_fragment differ diff --git a/pagefind/fragment/en_4e82ca6.pf_fragment b/pagefind/fragment/en_4e82ca6.pf_fragment new file mode 100644 index 000000000..0de11171e Binary files /dev/null and b/pagefind/fragment/en_4e82ca6.pf_fragment differ diff --git a/pagefind/fragment/en_5012188.pf_fragment b/pagefind/fragment/en_5012188.pf_fragment deleted file mode 100644 index f916985be..000000000 Binary files a/pagefind/fragment/en_5012188.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_5088448.pf_fragment b/pagefind/fragment/en_5088448.pf_fragment new file mode 100644 index 000000000..66057bc9a Binary files /dev/null and b/pagefind/fragment/en_5088448.pf_fragment differ diff --git a/pagefind/fragment/en_52b3b92.pf_fragment b/pagefind/fragment/en_52b3b92.pf_fragment new file mode 100644 index 000000000..1c7da44e2 Binary files /dev/null and b/pagefind/fragment/en_52b3b92.pf_fragment differ diff --git a/pagefind/fragment/en_9296e16.pf_fragment b/pagefind/fragment/en_5598339.pf_fragment similarity index 86% rename from pagefind/fragment/en_9296e16.pf_fragment rename to pagefind/fragment/en_5598339.pf_fragment index 0afb55aed..a8eec92fa 100644 Binary files a/pagefind/fragment/en_9296e16.pf_fragment and b/pagefind/fragment/en_5598339.pf_fragment differ diff --git a/pagefind/fragment/en_598450f.pf_fragment b/pagefind/fragment/en_598450f.pf_fragment new file mode 100644 index 000000000..563ca2ea4 Binary files /dev/null and b/pagefind/fragment/en_598450f.pf_fragment differ diff --git a/pagefind/fragment/en_7ee767f.pf_fragment b/pagefind/fragment/en_5acb6f9.pf_fragment similarity index 82% rename from pagefind/fragment/en_7ee767f.pf_fragment rename to pagefind/fragment/en_5acb6f9.pf_fragment index 67711f8dd..d457bf318 100644 Binary files a/pagefind/fragment/en_7ee767f.pf_fragment and b/pagefind/fragment/en_5acb6f9.pf_fragment differ diff --git a/pagefind/fragment/en_621257e.pf_fragment b/pagefind/fragment/en_621257e.pf_fragment new file mode 100644 index 000000000..840d83356 Binary files /dev/null and b/pagefind/fragment/en_621257e.pf_fragment differ diff --git a/pagefind/fragment/en_c5fcf24.pf_fragment b/pagefind/fragment/en_62d3a88.pf_fragment similarity index 81% rename from pagefind/fragment/en_c5fcf24.pf_fragment rename to pagefind/fragment/en_62d3a88.pf_fragment index 81352889e..abacbbdb8 100644 Binary files a/pagefind/fragment/en_c5fcf24.pf_fragment and b/pagefind/fragment/en_62d3a88.pf_fragment differ diff --git a/pagefind/fragment/en_67269a1.pf_fragment b/pagefind/fragment/en_67269a1.pf_fragment deleted file mode 100644 index 26406fd34..000000000 Binary files a/pagefind/fragment/en_67269a1.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_6e75558.pf_fragment b/pagefind/fragment/en_6e75558.pf_fragment deleted file mode 100644 index 7a82c763a..000000000 Binary files a/pagefind/fragment/en_6e75558.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_6f94863.pf_fragment b/pagefind/fragment/en_6f94863.pf_fragment new file mode 100644 index 000000000..2e4335217 Binary files /dev/null and b/pagefind/fragment/en_6f94863.pf_fragment differ diff --git a/pagefind/fragment/en_701ac82.pf_fragment b/pagefind/fragment/en_701ac82.pf_fragment deleted file mode 100644 index 16f71fca6..000000000 Binary files a/pagefind/fragment/en_701ac82.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_7061faf.pf_fragment b/pagefind/fragment/en_7061faf.pf_fragment new file mode 100644 index 000000000..399682042 Binary files /dev/null and b/pagefind/fragment/en_7061faf.pf_fragment differ diff --git a/pagefind/fragment/en_3022ff1.pf_fragment b/pagefind/fragment/en_71e1f51.pf_fragment similarity index 84% rename from pagefind/fragment/en_3022ff1.pf_fragment rename to pagefind/fragment/en_71e1f51.pf_fragment index 7ca59b01f..76771cf8d 100644 Binary files a/pagefind/fragment/en_3022ff1.pf_fragment and b/pagefind/fragment/en_71e1f51.pf_fragment differ diff --git a/pagefind/fragment/en_72ca47d.pf_fragment b/pagefind/fragment/en_72ca47d.pf_fragment deleted file mode 100644 index fd753c607..000000000 Binary files a/pagefind/fragment/en_72ca47d.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_78f0b58.pf_fragment b/pagefind/fragment/en_78f0b58.pf_fragment new file mode 100644 index 000000000..257d0918e Binary files /dev/null and b/pagefind/fragment/en_78f0b58.pf_fragment differ diff --git a/pagefind/fragment/en_db2b192.pf_fragment b/pagefind/fragment/en_7a731d6.pf_fragment similarity index 82% rename from pagefind/fragment/en_db2b192.pf_fragment rename to pagefind/fragment/en_7a731d6.pf_fragment index a9bed4073..dbcdf556a 100644 Binary files a/pagefind/fragment/en_db2b192.pf_fragment and b/pagefind/fragment/en_7a731d6.pf_fragment differ diff --git a/pagefind/fragment/en_7b6562f.pf_fragment b/pagefind/fragment/en_7b6562f.pf_fragment deleted file mode 100644 index 349995bd7..000000000 Binary files a/pagefind/fragment/en_7b6562f.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_7fedaf3.pf_fragment b/pagefind/fragment/en_7fedaf3.pf_fragment deleted file mode 100644 index db1cb6fc3..000000000 Binary files a/pagefind/fragment/en_7fedaf3.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_809fcfa.pf_fragment b/pagefind/fragment/en_809fcfa.pf_fragment deleted file mode 100644 index 96f3ff90d..000000000 Binary files a/pagefind/fragment/en_809fcfa.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_82d4e85.pf_fragment b/pagefind/fragment/en_82d4e85.pf_fragment new file mode 100644 index 000000000..160b0ba55 Binary files /dev/null and b/pagefind/fragment/en_82d4e85.pf_fragment differ diff --git a/pagefind/fragment/en_8466e41.pf_fragment b/pagefind/fragment/en_8466e41.pf_fragment deleted file mode 100644 index c7fdbd5f4..000000000 Binary files a/pagefind/fragment/en_8466e41.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_935fcb5.pf_fragment b/pagefind/fragment/en_935fcb5.pf_fragment deleted file mode 100644 index 8c6c07bbd..000000000 Binary files a/pagefind/fragment/en_935fcb5.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_93770d6.pf_fragment b/pagefind/fragment/en_93770d6.pf_fragment new file mode 100644 index 000000000..ebb86deea Binary files /dev/null and b/pagefind/fragment/en_93770d6.pf_fragment differ diff --git a/pagefind/fragment/en_93bf52e.pf_fragment b/pagefind/fragment/en_93bf52e.pf_fragment new file mode 100644 index 000000000..173c34b33 Binary files /dev/null and b/pagefind/fragment/en_93bf52e.pf_fragment differ diff --git a/pagefind/fragment/en_982454c.pf_fragment b/pagefind/fragment/en_982454c.pf_fragment deleted file mode 100644 index 1695c724e..000000000 Binary files a/pagefind/fragment/en_982454c.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_98c2c9a.pf_fragment b/pagefind/fragment/en_98c2c9a.pf_fragment deleted file mode 100644 index 5b2559f13..000000000 Binary files a/pagefind/fragment/en_98c2c9a.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_9a0427b.pf_fragment b/pagefind/fragment/en_9a0427b.pf_fragment new file mode 100644 index 000000000..febdbc688 Binary files /dev/null and b/pagefind/fragment/en_9a0427b.pf_fragment differ diff --git a/pagefind/fragment/en_9b765a8.pf_fragment b/pagefind/fragment/en_9b765a8.pf_fragment new file mode 100644 index 000000000..6f42a750d Binary files /dev/null and b/pagefind/fragment/en_9b765a8.pf_fragment differ diff --git a/pagefind/fragment/en_9b91585.pf_fragment b/pagefind/fragment/en_9b91585.pf_fragment deleted file mode 100644 index 7fa0ec250..000000000 Binary files a/pagefind/fragment/en_9b91585.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_9c34aff.pf_fragment b/pagefind/fragment/en_9c34aff.pf_fragment new file mode 100644 index 000000000..811f23eaf Binary files /dev/null and b/pagefind/fragment/en_9c34aff.pf_fragment differ diff --git a/pagefind/fragment/en_9d4a9ba.pf_fragment b/pagefind/fragment/en_9d4a9ba.pf_fragment new file mode 100644 index 000000000..737ef96df Binary files /dev/null and b/pagefind/fragment/en_9d4a9ba.pf_fragment differ diff --git a/pagefind/fragment/en_beec447.pf_fragment b/pagefind/fragment/en_9d86273.pf_fragment similarity index 86% rename from pagefind/fragment/en_beec447.pf_fragment rename to pagefind/fragment/en_9d86273.pf_fragment index bb9650d7a..3540366fb 100644 Binary files a/pagefind/fragment/en_beec447.pf_fragment and b/pagefind/fragment/en_9d86273.pf_fragment differ diff --git a/pagefind/fragment/en_9eb3ce5.pf_fragment b/pagefind/fragment/en_9eb3ce5.pf_fragment deleted file mode 100644 index 2622578cb..000000000 Binary files a/pagefind/fragment/en_9eb3ce5.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_9ee95ef.pf_fragment b/pagefind/fragment/en_9ee95ef.pf_fragment deleted file mode 100644 index cbff35b2c..000000000 Binary files a/pagefind/fragment/en_9ee95ef.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_a0e6b77.pf_fragment b/pagefind/fragment/en_a0e6b77.pf_fragment deleted file mode 100644 index 66e48987c..000000000 Binary files a/pagefind/fragment/en_a0e6b77.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_a3a7a8a.pf_fragment b/pagefind/fragment/en_a3a7a8a.pf_fragment deleted file mode 100644 index 793b69dfc..000000000 Binary files a/pagefind/fragment/en_a3a7a8a.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_a9898ec.pf_fragment b/pagefind/fragment/en_a9898ec.pf_fragment deleted file mode 100644 index 593ba4a88..000000000 Binary files a/pagefind/fragment/en_a9898ec.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_ada04e3.pf_fragment b/pagefind/fragment/en_ada04e3.pf_fragment new file mode 100644 index 000000000..7449f7079 Binary files /dev/null and b/pagefind/fragment/en_ada04e3.pf_fragment differ diff --git a/pagefind/fragment/en_6af01f4.pf_fragment b/pagefind/fragment/en_aed6984.pf_fragment similarity index 81% rename from pagefind/fragment/en_6af01f4.pf_fragment rename to pagefind/fragment/en_aed6984.pf_fragment index 2e8698ac0..141df2977 100644 Binary files a/pagefind/fragment/en_6af01f4.pf_fragment and b/pagefind/fragment/en_aed6984.pf_fragment differ diff --git a/pagefind/fragment/en_af8b33f.pf_fragment b/pagefind/fragment/en_af8b33f.pf_fragment deleted file mode 100644 index 8643fefe9..000000000 Binary files a/pagefind/fragment/en_af8b33f.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_afabd16.pf_fragment b/pagefind/fragment/en_afabd16.pf_fragment deleted file mode 100644 index 3784dbac5..000000000 Binary files a/pagefind/fragment/en_afabd16.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_7f1e981.pf_fragment b/pagefind/fragment/en_b7837aa.pf_fragment similarity index 87% rename from pagefind/fragment/en_7f1e981.pf_fragment rename to pagefind/fragment/en_b7837aa.pf_fragment index 4eb7c30b2..4d292a544 100644 Binary files a/pagefind/fragment/en_7f1e981.pf_fragment and b/pagefind/fragment/en_b7837aa.pf_fragment differ diff --git a/pagefind/fragment/en_baf21f9.pf_fragment b/pagefind/fragment/en_baf21f9.pf_fragment new file mode 100644 index 000000000..5a00213ad Binary files /dev/null and b/pagefind/fragment/en_baf21f9.pf_fragment differ diff --git a/pagefind/fragment/en_c273741.pf_fragment b/pagefind/fragment/en_c273741.pf_fragment new file mode 100644 index 000000000..10dddd1b9 Binary files /dev/null and b/pagefind/fragment/en_c273741.pf_fragment differ diff --git a/pagefind/fragment/en_c58d963.pf_fragment b/pagefind/fragment/en_c58d963.pf_fragment new file mode 100644 index 000000000..7f5ce935f Binary files /dev/null and b/pagefind/fragment/en_c58d963.pf_fragment differ diff --git a/pagefind/fragment/en_cd28c4c.pf_fragment b/pagefind/fragment/en_cd28c4c.pf_fragment deleted file mode 100644 index ba2ac7b38..000000000 Binary files a/pagefind/fragment/en_cd28c4c.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_cefe7ec.pf_fragment b/pagefind/fragment/en_cefe7ec.pf_fragment new file mode 100644 index 000000000..abe3913be Binary files /dev/null and b/pagefind/fragment/en_cefe7ec.pf_fragment differ diff --git a/pagefind/fragment/en_d678e6c.pf_fragment b/pagefind/fragment/en_d678e6c.pf_fragment new file mode 100644 index 000000000..753feaa76 Binary files /dev/null and b/pagefind/fragment/en_d678e6c.pf_fragment differ diff --git a/pagefind/fragment/en_288b85b.pf_fragment b/pagefind/fragment/en_dc509a2.pf_fragment similarity index 84% rename from pagefind/fragment/en_288b85b.pf_fragment rename to pagefind/fragment/en_dc509a2.pf_fragment index 7d1910633..5540998d5 100644 Binary files a/pagefind/fragment/en_288b85b.pf_fragment and b/pagefind/fragment/en_dc509a2.pf_fragment differ diff --git a/pagefind/fragment/en_dc8fa08.pf_fragment b/pagefind/fragment/en_dc8fa08.pf_fragment new file mode 100644 index 000000000..8c0d13a58 Binary files /dev/null and b/pagefind/fragment/en_dc8fa08.pf_fragment differ diff --git a/pagefind/fragment/en_df8c459.pf_fragment b/pagefind/fragment/en_df8c459.pf_fragment new file mode 100644 index 000000000..9319e91cf Binary files /dev/null and b/pagefind/fragment/en_df8c459.pf_fragment differ diff --git a/pagefind/fragment/en_e46fc8d.pf_fragment b/pagefind/fragment/en_e46fc8d.pf_fragment new file mode 100644 index 000000000..bd2cca033 Binary files /dev/null and b/pagefind/fragment/en_e46fc8d.pf_fragment differ diff --git a/pagefind/fragment/en_e86dc79.pf_fragment b/pagefind/fragment/en_e86dc79.pf_fragment deleted file mode 100644 index 64e4b657c..000000000 Binary files a/pagefind/fragment/en_e86dc79.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_e956d6c.pf_fragment b/pagefind/fragment/en_e956d6c.pf_fragment new file mode 100644 index 000000000..7b30ecf0f Binary files /dev/null and b/pagefind/fragment/en_e956d6c.pf_fragment differ diff --git a/pagefind/fragment/en_e97f75e.pf_fragment b/pagefind/fragment/en_e97f75e.pf_fragment deleted file mode 100644 index 69b5e0cd8..000000000 Binary files a/pagefind/fragment/en_e97f75e.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_ed4258a.pf_fragment b/pagefind/fragment/en_ed4258a.pf_fragment new file mode 100644 index 000000000..8aa7c6afb Binary files /dev/null and b/pagefind/fragment/en_ed4258a.pf_fragment differ diff --git a/pagefind/fragment/en_ef6b59e.pf_fragment b/pagefind/fragment/en_ef6b59e.pf_fragment deleted file mode 100644 index ea2640f92..000000000 Binary files a/pagefind/fragment/en_ef6b59e.pf_fragment and /dev/null differ diff --git a/pagefind/fragment/en_10636a0.pf_fragment b/pagefind/fragment/en_ef6dbda.pf_fragment similarity index 83% rename from pagefind/fragment/en_10636a0.pf_fragment rename to pagefind/fragment/en_ef6dbda.pf_fragment index b7371822c..56429c5df 100644 Binary files a/pagefind/fragment/en_10636a0.pf_fragment and b/pagefind/fragment/en_ef6dbda.pf_fragment differ diff --git a/pagefind/fragment/en_eff0ba7.pf_fragment b/pagefind/fragment/en_eff0ba7.pf_fragment new file mode 100644 index 000000000..b6df70057 Binary files /dev/null and b/pagefind/fragment/en_eff0ba7.pf_fragment differ diff --git a/pagefind/fragment/en_342c912.pf_fragment b/pagefind/fragment/en_f8ce2bd.pf_fragment similarity index 79% rename from pagefind/fragment/en_342c912.pf_fragment rename to pagefind/fragment/en_f8ce2bd.pf_fragment index 8b7b65b68..34d8ba5ad 100644 Binary files a/pagefind/fragment/en_342c912.pf_fragment and b/pagefind/fragment/en_f8ce2bd.pf_fragment differ diff --git a/pagefind/fragment/en_fa283f5.pf_fragment b/pagefind/fragment/en_fa283f5.pf_fragment new file mode 100644 index 000000000..84a1a1719 Binary files /dev/null and b/pagefind/fragment/en_fa283f5.pf_fragment differ diff --git a/pagefind/pagefind-entry.json b/pagefind/pagefind-entry.json index 89c820125..8163fbc51 100644 --- a/pagefind/pagefind-entry.json +++ b/pagefind/pagefind-entry.json @@ -1 +1 @@ -{"version":"1.1.1","languages":{"en":{"hash":"en_3cc31ad778","wasm":"en","page_count":105}}} \ No newline at end of file +{"version":"1.1.1","languages":{"en":{"hash":"en_96bc1bc92d","wasm":"en","page_count":105}}} \ No newline at end of file diff --git a/pagefind/pagefind.en_3cc31ad778.pf_meta b/pagefind/pagefind.en_3cc31ad778.pf_meta deleted file mode 100644 index 47807e3f1..000000000 Binary files a/pagefind/pagefind.en_3cc31ad778.pf_meta and /dev/null differ diff --git a/pagefind/pagefind.en_96bc1bc92d.pf_meta b/pagefind/pagefind.en_96bc1bc92d.pf_meta new file mode 100644 index 000000000..d78af82fc Binary files /dev/null and b/pagefind/pagefind.en_96bc1bc92d.pf_meta differ diff --git a/pattern/content-assembler/index.html b/pattern/content-assembler/index.html index df749fdeb..a304b9d7a 100644 --- a/pattern/content-assembler/index.html +++ b/pattern/content-assembler/index.html @@ -244,8 +244,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 21 2024, 8:31 AM.

\ No newline at end of file diff --git a/pattern/content-assembler/index.html.br b/pattern/content-assembler/index.html.br index a0ca4e6f6..f4bc5da5c 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 2dbc2c1c6..2a25532dd 100644 --- a/pattern/direct-messaging-service/index.html +++ b/pattern/direct-messaging-service/index.html @@ -244,11 +244,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 21 2024, 8:31 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 c8381926b..cf955b6d2 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 b85400452..dda911df5 100644 --- a/pattern/fhir-explorer/index.html +++ b/pattern/fhir-explorer/index.html @@ -244,8 +244,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 21 2024, 8:31 AM.

\ No newline at end of file diff --git a/pattern/fhir-explorer/index.html.br b/pattern/fhir-explorer/index.html.br index 354b25c9b..fab1966ff 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 0f59dca38..7021dfe9b 100644 --- a/pattern/index.html +++ b/pattern/index.html @@ -244,8 +244,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 21 2024, 8:31 AM.

\ No newline at end of file diff --git a/pattern/index.html.br b/pattern/index.html.br index 1419a3b6a..3b305304d 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 a0c2f6b5c..9edf713d5 100644 --- a/pattern/lectio/index.html +++ b/pattern/lectio/index.html @@ -244,8 +244,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 21 2024, 8:31 AM.

\ No newline at end of file diff --git a/pattern/lectio/index.html.br b/pattern/lectio/index.html.br index b402b8800..d5acd29f1 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 67f2f840e..6de44dd84 100644 --- a/pattern/osquery/index.html +++ b/pattern/osquery/index.html @@ -244,8 +244,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 21 2024, 8:31 AM.

\ No newline at end of file diff --git a/pattern/osquery/index.html.br b/pattern/osquery/index.html.br index 4107e8bd3..36aa424a7 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 b207443e1..7c24dd04e 100644 --- a/services/index.html +++ b/services/index.html @@ -244,6 +244,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 b79060092..146f2422c 100644 Binary files a/services/index.html.br and b/services/index.html.br differ