dnf install -y epel-release
dnf install -y tar postgresql-server postgresql-contrib java-11-openjdk

#optional
dnf install -y vim tmux bc id3lib html2text p7zip-plugins libjpeg-turbo poppler-utils unzip netpbm-progs perl-Image-ExifTool
#optional manual install catdoc unrtf ffmpeg

newcfg (){
	F="$1"
	chown --reference="$F" "$F".new
	chmod --reference="$F" "$F".new
	mv -f "$F".new "$F"
}

#PostgreSQL
/usr/bin/postgresql-setup --initdb --unit postgresql
systemctl enable postgresql
TMP=/var/lib/pgsql/data/pg_hba.conf
cp $TMP $TMP.original
cat $TMP | grep -vP "^ *host.*127" > $TMP.new
echo -e "host\tall\tall\t127.0.0.1/32\tpassword" >> $TMP.new
newcfg $TMP
TMP=/var/lib/pgsql/data/postgresql.conf
cp $TMP $TMP.original
MT=$(cat /proc/meminfo | grep MemTotal | perl -pe 's/^[^ ]* *([0-9]+) *kB$/$1\/1000/g');
#java+linux=(512+256)
ECS=$(echo "($MT-(512+256))/2" | bc);
SB=$(echo "($MT-(512+256))/4" | bc);
cat $TMP | perl -pe 's/^#?(effective_cache_size)[ \t]*=[ \t]*[^ \t]+([ \t].*)?$/$1 = '$ECS'MB$2/g' \
| perl -pe 's/^#?(shared_buffers)[ \t]*=[ \t]*[^ \t]+([ \t].*)?$/$1 = '$SB'MB$2/g' \
| perl -pe 's/^#?(max_locks_per_transaction)[ \t]*=[ \t]*[^ \t]+([ \t].*)?$/$1 = 512$2/g' \
| perl -pe 's/^#?(max_connections)[ \t]*=[ \t]*[^ \t]+([ \t].*)?$/$1 = 60$2/g' \
| perl -pe 's/^#?(checkpoint_segments)[ \t]*=[ \t]*[^ \t]+([ \t].*)?$/$1 = 30$2/g' \
| perl -pe 's/^#?(log_min_duration_statement)[ \t]*=[ \t]*[^ \t]+([ \t].*)?$/$1 = 30000$2/g' \
| perl -pe 's/^#?(log_line_prefix)[ \t]*=[ \t]*[^#]+(#.*)?$/$1 = '\''%m: '\''\t\t$2/g' \
> $TMP.new
newcfg $TMP
systemctl start postgresql

#Noodle
cd /opt
tar -zxf ./Noodle.tar.gz
su postgres -c 'cd;/usr/bin/psql -d postgres -U postgres --file /opt/Noodle/init.sql' 
cd Noodle
cp noodle.service /lib/systemd/system/
systemctl enable noodle
systemctl start noodle

Other Linux Installation examples available.

Noodle respects requests for dark mode with the "prefers-color-scheme:dark" CSS that can be customized.

Web Browsers respect requests for dark mode by the Operating System, and can be customized:

  • Firefox:
    • about:config > ui.systemUsesDarkTheme=1
  • Firefox(Android):
    • Settings > Customize > Dark
  • Chrome(Desktop):
    • chrome://flags > "Force Dark Mode for Web Contents"
    • Note that as of v85 Chrome "prefers-color-scheme" is not supported, instead chrome will attempt to write it's own CSS for the page, often causing breakage (still true @ v105).
    • use chrome --force-dark-mode --enable-features=WebUIDarkMode to fix bug on Linux.

Operating Systems can be customized to use dark mode:

  • Windows:
    • Settings > Personalization > Colors > Choose your color > Dark
  • MacOS:
    • Apple > System Preferences, General, Appearance > Dark
  • Gnome/KDE(Linux):
    • Settings > Appearance > Dark
    • Tweaks > Appearance > Legacy > Dark
  • Android(Linux):
    • Settings > Display > Dark theme
  • iOS:
    • Settings > Display & Brightness > Dark

Other sites that support dark mode as of 2020:

Other sites that support dark mode as of 2025:

Any user with access to system tools can reset the admin password with a web browser.

Any person with access to the SQL server can change the admin password to another users password

select object_id, username, password from users where username = 'admin' or username = '$ME';
update users set password = '$PASS' where object_id = '$ID';

For example

update users set password = 'P3b*cH.5fOBTJl5ELM)W' where username = 'admin';

  • Name of Product/Version: Noodle / 7.08.11
  • Report Date: 2020-08-10
  • Product Description: Intranet Software
  • Automated Testing.
  • Contact Information: https://vialect.com

Level A

Criteria

Conformance Level 

Remarks and Explanations

1.1.1 Non-text Content (Level A)

Supports

All buttons have descriptive title attributes or text content

1.2.1 Audio-only and Video-only (Prerecorded) (Level A)

SupportsNotifications use Operating System visual alters to complement audio alters. Audio alerts can be disabled.

1.2.2 Captions (Prerecorded) (Level A)

Not ApplicableNo audio/video content is included, users are responsible for making their own content compliant. Means are available for pre-recorded and live descriptions, subtitles, and sign language content.

1.2.3 Audio Description or Media Alternative (Prerecorded) (Level A)

Not Applicable"

1.3.1 Info and Relationships (Level A)

SupportsWith multiple text application views, and APIs data relationships are programmatically determinable.

1.3.2 Meaningful Sequence (Level A)

Supports"

1.3.3 Sensory Characteristics  (Level A)

SupportsSee 1.1.1 Remarks.

1.4.1 Use of Color (Level A)

SupportsThe default style sheet is high contrast. Color indicators are accompanied by icons and text. Color indicators can be disabled. User created content has automatic contrast assist (posters). Maximum contrast styles can be achieved with custom style sheets or options.

1.4.2 Audio Control (Level A)

SupportsAudio alerts can be disabled. User uploaded media has default controls including volume. (As of 2020 individual web-cam/screen-share volume is supported in Chrome not Firefox)

2.1.1 Keyboard (Level A)

SupportsAll actions are achievable with [shift]tab,space,return.

2.1.2 No Keyboard Trap (Level A)

SupportsNo Keyboard Traps are present.

2.1.4 Character Key Shortcuts (Level A 2.1 only)

Supports

No Key Shortcuts are defined. Default shortcuts (copy/paste) are not disabled.

2.2.1 Timing Adjustable (Level A)

SupportsLogin session time limit can be changed and disabled. TOTP has a fixed limit but is optional.

2.2.2 Pause, Stop, Hide (Level A)

SupportsThere is no moving, scrolling information. Blinking, and auto-updating information can be stopped and scrolled respectively, and is only used where necessary in optional live feeds.

2.3.1 Three Flashes or Below Threshold (Level A)

SupportsTitle bar notification flash can be disabled and updates every 1/2 a second when enabled.

2.4.1 Bypass Blocks (Level A)

SupportsContent Blocks are not repeated.

2.4.2 Page Titled (Level A)

SupportsMeaningful Titles are displayed

2.4.3 Focus Order (Level A)

Supportsnavigation sequences does not affect meaning.

2.4.4 Link Purpose (In Context) (Level A)

SupportsLink purpose can be equally determined from context programmatically and generally.

2.5.1 Pointer Gestures (Level A 2.1 only)

Supports

Multi-point and path-based gestures have alternatives (widget order via drag and admin down button, zoom via pinch and tap and click). All can be disabled.

2.5.2 Pointer Cancellation (Level A 2.1 only)

Supports

All persistent actions have an Abort option and or undo action.All actions that use a down event by requirement (drag and drop) have alternatives (order and upload buttons).

2.5.3 Label in Name (Level A 2.1 only)

Supports

All user interface components contain text by which software can identify it to the user.

2.5.4 Motion Actuation (Level A 2.1 only)

Supports 

See 2.5.1 Remarks.

3.1.1 Language of Page (Level A)

SupportsThe lang attribute is used on all pages.

3.2.1 On Focus (Level A)

SupportsFocus has no context change (Notifications can be suppressed on focus)

3.2.2 On Input (Level A)

SupportsSetting changes (without submit button use ) will not change context.

3.3.1 Error Identification (Level A)

SupportsOn input error detection, a text description is shown and where convenient the input focused

3.3.2 Labels or Instructions (Level A)

SupportsLabels or instructions are provided for user input, and also for user generated user input.

4.1.1 Parsing (Level A)

Supportsmarkup conforms to specification.

4.1.2 Name, Role, Value (Level A)

Supports"

Level AA

Criteria

Conformance Level 

Remarks and Explanations

1.2.4 Captions (Live) (Level AA)

Not ApplicableSee 1.2.2 Remarks.

1.2.5 Audio Description (Prerecorded) (Level AA)

Not Applicable"

1.3.4 Orientation (Level AA 2.1 only)

Supports

Content flows, with minimal fixed width components.

1.3.5 Identify Input Purpose (Level AA 2.1 only)

Supports

programmatic Identification of Input Purpose can be achieved with placeholders, names, and previous elements.

1.4.3 Contrast (Minimum) (Level AA)

SupportsSee 1.4.1 Remarks.

1.4.4 Resize text (Level AA)

Supports300% text size is supported on 4k screens, mobile UI uses large text by default.

1.4.5 Images of Text (Level AA)

SupportsNo images of text are used.

1.4.10 Reflow (Level AA 2.1 only)

Supports

320 pixel width is supported via the mobile and top-navigation interfaces.

1.4.11 Non-text Contrast (Level AA 2.1 only)

Supports

See 1.4.1 Remarks.

1.4.12 Text Spacing (Level AA 2.1 only)

Supports

2x default text spacing is supported via zoom, custom CSS, or plugins.

1.4.13 Content on Hover or Focus (Level AA 2.1 only)

Supports 

Custom tooltips are inlined when no pointer is detected or by option. selection and focus are supported. q will dismiss.

2.4.5 Multiple Ways (Level AA)

SupportsWith multiple application views, content views, and navigation options, in addition to quick links, external links, and custom user links Multiple Ways are supported.

2.4.6 Headings and Labels (Level AA)

SupportsStandardized Headings and Labels are used to make page purpose intuitive and programmatically identifiable.

2.4.7 Focus Visible (Level AA)

SupportsKeyboard focus is visible and adjustable with custom CSS (a:focus-visible,input:focus-visible{border:solid 5px red})

3.1.2 Language of Parts (Level AA)

SupportsPart language can differ from page language only via user input and that accepts tagging for programmatic use for the body of the content. the language of user input titles does not support direct language tags for programmatic use. A custom script can be used to tag persistent multi language features if required.

3.2.3 Consistent Navigation (Level AA)

SupportsNavigation including order is persistent (and can be customized to sort alphabetically, by date, or in a custom order)

3.2.4 Consistent Identification (Level AA)

SupportsButtons/Links of different types are identifiable by class (navigation vs persistent action)

3.3.3 Error Suggestion (Level AA)

SupportsError Suggestions are avoided by limiting input to begin with (entering text in a numeric, invalid dates, etc)

3.3.4 Error Prevention (Legal, Financial, Data) (Level AA)

SupportsLegal and Financial Data are not used, but input is reviewable, and reversible. (instant messenger can be disabled to support only reversible content), input validation is performed before submission when supported. trash/recycle bin, and remove/purge of content is confirmed.

4.1.3 Status Messages (Level AA 2.1 only)

SupportsStatus messages can be identified by class.

Level AAA

Criteria

Conformance Level 

Remarks and Explanations

1.2.6 Sign Language (Prerecorded) (Level AAA)

Not ApplicableSee 1.2.2 Remarks.

1.2.7 Extended Audio Description (Prerecorded) (Level AAA)

Not Applicable"

1.2.8 Media Alternative (Prerecorded) (Level AAA)

Not Applicable"

1.2.9 Audio-only (Live) (Level AAA)

Not Applicable"

1.3.6 Identify Purpose (Level AAA 2.1 only)

SupportsUser Interface Components can be programmatically determined via attribute naming conventions.

1.4.6 Contrast (Enhanced)  (Level AAA)

SupportsSee 1.4.1 Remarks.

1.4.7 Low or No Background Audio (Level AAA)

SupportsSee 1.4.2 Remarks.

1.4.8 Visual Presentation (Level AAA)

Partially SupportsColors are user select-able. Width can be under 80 characters with the mobile view. The justify text alignment is not used. Line and paragraph spacing are default and adjustable. Text can be resized without assistive technology up to 200 percent in a way that does not require the user to scroll horizontally to read a line of text on supported screen sizes. Large Workflows on small monitors may require horizontal scrolling.

1.4.9 Images of Text (No Exception) (Level AAA)

SupportsNo images of text are used. Users are responsible for their own content selection and alternatives.

2.1.3 Keyboard (No Exception) (Level AAA)

SupportsNo timeouts on input are not imposed without customization.

2.2.3 No Timing (Level AAA)

SupportsSee 2.2.1 Remarks.

2.2.4 Interruptions (Level AAA)

SupportsInterruptions can be postponed or suppressed by the user (login obviously excepted).

2.2.5 Re-authenticating (Level AAA)

SupportsDocument editing is auto saved every keystroke to Web Browser Storage, and users are prompted to recover for convenience.

2.2.6 Timeouts (Level AAA 2.1 only)

Supports"

2.3.2 Three Flashes (Level AAA)

SupportsSee 2.3.1 Remarks.

2.3.3 Animation from Interactions (Level AAA 2.1 only)

Supportsprefers-reduced-motion is respected.

2.4.8 Location (Level AAA)

Supportsbreadcrumb trails are provided.

2.4.9 Link Purpose (Link Only) (Level AAA)

SupportsSee 1.3.6 Remarks.

2.4.10 Section Headings (Level AAA)

Supports 

2.5.5 Target Size (Level AAA 2.1 only)

SupportsTarget size is increased automatically when lower accuracy input is detected. Can also be forced/customized

2.5.6 Concurrent Input Mechanisms (Level AAA 2.1 only)

Supportsmultiple concurrent input types are supported.

3.1.3 Unusual Words (Level AAA)

SupportsVia select > right click > search web for. Abbreviations, idioms, and jargon are avoided.

3.1.4 Abbreviations (Level AAA)

Supports"

3.1.5 Reading Level (Level AAA)

SupportsCommon words are used where long explanations of technical terms would not be required

3.1.6 Pronunciation (Level AAA)

SupportsSee 1.3.1 Remarks.

3.2.5 Change on Request (Level AAA)

SupportsSee 2.2.1 Remarks.

3.3.5 Help (Level AAA)

Partially SupportsThere are select help icons and paragraphs in some contexts for clarity.

3.3.6 Error Prevention (All) (Level AAA)

SupportsSee 3.3.4 Remarks.

The Business Continuity Plan for local installs is mostly up to the client and we provide a site export feature by which all data is converted to standard formats in a zip file to avoid vendor lock-in. We also have a HA option. and restoring from backups can be tested in a virtual machine.

Hosted instances have security measures in place and can be restored to any cloud or local environment. We maintain backup domains with multiple registries.

Example scripts for a High availability install of Noodle 7.08.05+.

1) Install 3+ Linux instances with password-less key authentication, run the following on each (using real IPs and domains);

hostname must match domain name.

IP1=192.168.0.141 #dn1
IP2=192.168.0.142 #dn2
IP3=192.168.0.143 #dn3
IP="$(ip addr show | grep "inet " | grep -v 127.0.0.1 | head -n 1 | perl -pe 's/\/.*//g;s/.* //g')"

apt update
apt -y dist-upgrade
apt -y install ceph-fuse openjdk-11-jre
apt -y purge snapd landscape-common
apt -y autoremove

#if public domains are not in use;
echo "
$IP1 dn1 dn
$IP2 dn2 dn
$IP3 dn3 dn
" >> /etc/hosts

2) Install Ceph from the admin node (all nodes will wipe /dev/xvdb);

(Ubuntu 20.04 requires this patch first.)

POOL=noodle
apt-get -y install ceph-deploy

ceph-deploy new dn1 dn2 dn3
ceph-deploy install dn1 dn2 dn3
ceph-deploy mon create-initial
ceph-deploy admin dn1 dn2 dn3
ceph-deploy mgr create dn1 dn2 dn3
for N in dn1 dn2 dn3 ; do
        ceph-deploy osd create $N --data /dev/xvdb
done
ceph-deploy mds create dn1 dn2 dn3
for N in dn1 dn2 dn3 ; do
        ceph-deploy mon add $N
done
ceph osd pool create ${POOL}_data 16
ceph osd pool create ${POOL}_meta 16
ceph fs new ${POOL}_fs ${POOL}_meta ${POOL}_data
for N in dn1 dn2 dn3 ; do
	ssh $N "echo 'none /opt/Noodle/FSDB fuse.ceph ceph.name=client.admin,_netdev,defaults 0 0' >> /etc/fstab && mount -a"
done

3) Install CockroachDB on all nodes;

cd /opt
wget -qO- https://binaries.cockroachdb.com/cockroach-v19.2.2.linux-amd64.tgz | tar  xvz
cp /opt/Noodle/cockroachdb.service /lib/systemd/system/
perl -pi -e "s/\$IPS/${IP1},${IP2},${IP3}/g;s/\$IP/${IP1}/g" /lib/systemd/system/cockroachdb.service
systemctl enable cockroachdb
systemctl start cockroachdb

4) initialize CockroachDB from the admin node;

./cockroach-v19.2.2.linux-amd64/cockroach init --insecure --host=${IP}
echo "CREATE USER noodleuser; CREATE DATABASE noodledb WITH ENCODING = 'UNICODE'; GRANT ALL ON DATABASE noodledb to noodleuser;" | ./cockroach-v19.2.2.linux-amd64/cockroach sql --insecure --host=${IP}:26257

5) Install Noodle on all nodes;

cd /opt
tar -xf Noodle.tar.gz
cd ./Noodle
echo "NoodleNodes[] = ${IP1}, ${IP2}, ${IP3}
FSDB = /opt/Noodle/FSDB" >> conf/noodle.properties
perl -pi -e 's/^(DatabaseManager.DB.intranet.Connection.Url = ).*/$1"jdbc:postgresql:\/\/'"$IP"':26257\/noodledb"/g' conf/noodle.properties
cp noodle.service /lib/systemd/system/
perl -pi -e 's/postgreql.service/ceph.target cockroachdb.service/g' /lib/systemd/system/noodle.service
systemctl enable noodle
systemctl start noodle

letsencrypt offers free HTTPS certificates with the limitation that you need to set them up to auto renew every ~3 months. Below are some example scripts that last of which should be called from cron.

Settings

DOMAIN=noodle.example.com
EMAIL=me@example.com
PASS=example
DIR=/opt/Noodle/ACME

Initialize

. /opt/Noodle/settings.sh
apt install -y certbot
systemctl disable certbot
mkdir $DIR
certbot register --agree-tos --no-eff-email -m "$EMAIL"
certbot certonly --webroot \
	--webroot-path $DIR \
	--cert-name "$DOMAIN" \
	-d "$DOMAIN"
/opt/Noodle/deploy.sh

Deploy

systemctl restart noodle.service

Renew

. /opt/Noodle/settings.sh
certbot renew --webroot \
	--webroot-path $DIR \
	--cert-name "$DOMAIN" \
	--deploy-hook /opt/Noodle/deploy.sh

Currently Noodle must be restarted to reload the keystore.

BranchVersionFirst buildLatest build
Long Term Support (LTS)7.12.072023-11-022024-05-22
Release7.13.012024-11-022024-11-26
Next7.13.022024-12-02Today

Long Term Support Versions (annually)

VersionReleaseRetirement
7.12.072023-12-022025-01-02
7.11.032022-11-022024-01-02
7.08.232021-12-012023-01-02
7.08.132020-11-032022-01-02
7.08.022019-10-022021-01-02
7.05.122019-02-192020-01-02

Release Versions (monthly)

VersionReleaseRetirement
7.13.012024-12-022025-01-02
7.12.172024-11-022024-12-02
7.12.162024-10-022004-11-02
7.12.152024-09-022004-10-02
7.12.142024-08-022004-09-02
7.12.132024-07-022024-08-02
7.12.122024-04-182024-07-02
7.12.112024-04-082024-04-18
7.12.102024-04-022024-04-08
7.12.092024-03-022024-04-02
7.12.082024-02-022024-03-02
7.12.072023-12-022024-01-02
7.12.062023-11-022023-12-02
7.12.052023-10-022023-11-02
7.12.042023-09-022023-10-02
7.12.032023-08-022023-09-02
7.12.022023-07-022023-08-02
7.12.012023-06-022023-07-02
7.11.072023-05-022023-06-02
7.11.062023-04-022023-05-02
7.11.052023-03-022023-04-02
7.11.042023-02-022023-03-02
7.11.032022-11-022023-02-02
7.11.022022-10-022022-11-02
7.11.012022-09-192022-10-02
7.10.012022-08-022022-09-02
7.09.042022-07-022022-08-02
7.09.032022-06-022022-07-02
7.09.022022-05-022022-06-02
7.09.012022-04-022022-05-02
7.08.262022-03-022022-04-02
7.08.252022-02-022022-03-02
7.08.242022-01-022022-02-02
7.08.222021-11-022021-12-02
7.08.212021-10-022021-11-02
7.08.202021-07-022021-10-02
7.08.192021-06-022021-07-02
7.08.182021-05-022021-06-02
7.08.172021-04-022021-05-02
7.08.162021-03-022021-04-02
7.08.152021-02-022021-03-02
7.08.142021-01-022021-02-02
7.08.122020-10-022020-11-02
7.08.112020-09-022020-10-02
7.08.102020-08-022020-09-02
7.08.092020-07-022020-08-02
7.08.082020-06-022020-07-02
7.08.072020-05-022020-06-02
7.08.062020-04-022020-05-02
7.08.052020-03-022020-04-02
7.08.042020-02-022020-03-02
7.08.032019-12-022020-01-02
7.08.012019-09-022019-10-02
7.06.052019-08-022019-09-02
7.06.042019-07-022019-08-02
7.06.032019-06-022019-07-02
7.06.022019-05-022019-06-02
7.06.012019-04-022019-05-02
7.05.132019-03-022019-04-02
...
4.01.012001-06-082001-06-08
...