A comprehensive RNA-Seq quality control Shiny application with email-based session management, interactive PCA analysis, and cross-app pipeline integration.
- Interactive Metadata Editing β Click-to-edit sample labels and groups with undo support
- Gene Annotation β g:Profiler (online) or GTF file parsing for 7+ organisms
- Count Visualization β Violin plots with box plots and scatter points
- PCA Analysis β DESeq2 VST normalization with interactive Plotly plots
- Expression Heatmaps β Top loading genes with customizable clustering
- Email-based sessions β All your sessions linked to your email address
- Manual save workflow β Click 'Save Now' to save (button turns yellow when unsaved)
- Unsaved changes warning β Browser confirms before losing unsaved work
- Activity logging β All session activity tracked in CSV log
- Cross-app pipeline β Send QC'd data directly to DEG-Explorer
- Customizable point sizes, colors, and opacity
- 3-color gradient system for large group counts (40+)
- Multiple PC combinations (PC1-PC10+)
- Export plots as PNG, PDF, SVG, or interactive HTML
# Install Bioconductor
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
# Install DESeq2
BiocManager::install("DESeq2")The app will auto-install missing packages, but you can pre-install:
install.packages(c(
"shiny", "bslib", "jsonlite", "reactable", "dplyr", "tidyr",
"tibble", "rlang", "shinycssloaders", "blastula", "glue",
"shinyjs", "plotly", "ggplot2", "matrixStats", "shinyjqui",
"viridisLite", "colourpicker", "heatmaply", "DT",
"RColorBrewer", "gprofiler2", "digest"
))git clone https://github.com/yourusername/qc-checker.git
cd qc-checker# In R
shiny::runApp()docker build -t qc-checker .
docker run -p 3838:3838 -v $(pwd)/shared:/srv/shiny-server/shared qc-checkerCopy files to your Shiny Server directory:
cp -r qc-checker /srv/shiny-server/
cp -r shared /srv/shiny-server//srv/shiny-server/
β
βββ shared/ # Shared resources (required)
β βββ module_user_sessions.R # User & session management
β βββ module_email_notifications.R # Email notifications
β βββ admin_utils.R # Admin CLI tools
β βββ sessions/ # Session storage (auto-created)
β βββ registry.json
β βββ session_activity_log.csv
β βββ users/{email_hash}/qc-checker/*.rds
β
βββ qc-checker/ # Application
βββ app.R # Main application
βββ module_email_notifications.R # Email module (local copy)
βββ setup_email.R # Email credentials setup
βββ Example_Data.RData # Sample dataset
βββ .credentials/ # Email credentials (git-ignored)
β βββ gmail_creds
βββ .gitignore
Your .RData file must contain:
# counts: A matrix/data.frame with genes as rows, samples as columns
# Row names = gene IDs, Column names = sample labels
counts <- matrix(...)
# metadata: A data.frame with sample information
# Must have 'label' and 'group' columns
metadata <- data.frame(
label = c("Sample1", "Sample2", ...),
group = c("Control", "Treatment", ...),
... # Additional columns optional
)
save(counts, metadata, file = "my_data.RData")Optional feature for receiving session change summaries.
- Go to Google App Passwords
- Enable 2-factor authentication if not already enabled
- Generate an App Password for "Mail"
- Copy the 16-character password
cd /srv/shiny-server/qc-checker
Rscript setup_email.R your.email@gmail.comThe script will prompt for your App Password and create .credentials/gmail_creds.
| Variable | Default | Description |
|---|---|---|
PIPELINE_SHARED_PATH |
../shared |
Path to shared modules |
PIPELINE_SESSIONS_PATH |
../shared/sessions |
Session storage path |
DEG_EXPLORER_URL |
../deg-explorer/ |
URL for cross-app linking |
EMAIL_CREDS_FILE |
.credentials/gmail_creds |
Email credentials path |
version: '3.8'
services:
qc-checker:
build: .
ports:
- "3838:3838"
volumes:
- ./shared:/srv/shiny-server/shared
- ./qc-checker/.credentials:/srv/shiny-server/qc-checker/.credentials:ro
environment:
- PIPELINE_SHARED_PATH=/srv/shiny-server/shared
- PIPELINE_SESSIONS_PATH=/srv/shiny-server/shared/sessionsView user and session data from the command line:
source("shared/admin_utils.R")
# View all users
view_users()
# View all sessions
view_sessions()
# View activity log
view_activity_log()
# Export to CSV
export_admin_data()
# Quick stats
quick_stats()βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β QC-CheckeR Pipeline β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β 1. Enter Email βββΊ 2. Upload Data βββΊ 3. Edit Metadata β
β β β
β βΌ β
β 6. Send to 5. Run PCA βββ 4. Annotate Genes β
β DEG-Explorer β (optional) β
β β βΌ β
β β View Results β
β β β’ Violin plots β
β β β’ PCA scatter β
β β β’ Heatmaps β
β β β β
β βΌ βΌ β
β DEG-Explorer Export Data β
β (Coming Soon) β’ CSV files β
β β’ Plot images β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- β¨ Email-based user session management
- β¨ Unsaved changes warning with visual indicator
- β¨ Session activity logging to CSV
- β¨ Cross-app linking to DEG-Explorer
- β¨ Improved session loading with file name preservation
- π§ Fixed email credentials path for Docker compatibility
- π§ Manual save workflow (auto-save disabled)
- β¨ Gene annotation via g:Profiler and GTF parsing
- β¨ Expression heatmaps with clustering
- β¨ Session storage with RDS files
- π§ Removed Python/gffutils dependency
- π§ Fixed PCA plot download in Docker (ggplot2 instead of webshot2)
cd /srv/shiny-server/qc-checker
Rscript setup_email.R your.email@gmail.com- Check that
shared/sessions/directory exists and is writable - Verify
PIPELINE_SESSIONS_PATHenvironment variable
- Ensure counts are raw integers (not normalized)
- Check for samples with all zeros
- Verify metadata labels match count column names
chmod -R 775 shared/sessions
chown -R shiny:shiny shared/sessionsMIT License - see LICENSE for details.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
For questions or issues, please open a GitHub issue.