An other approach may rely on code obfuscation. Though I know about FPT/WinFPT by simcon only because of one of the monthly calls where it was presented as a tool to bring elder FORTRAN source code to modern Fortran, the program equally includes this as a security feature. The developers illustrate this by passing a snippet «part of an (unclassified) F16 aircraft model» of
REAL THTL, THRSTKN
REAL YREFR, ZREFR
REAL YREFT, ZREFT
C
REAL TGEAR
C
SAVE
C
C
C *********************************************************
C *** Start of executable code ***
C *********************************************************
C
C**********************************************************
C*** Engine dynamics ***
C**********************************************************
C
C Initialize the engine power at the initial throttle
C
IF (FPASS .EQ. 1) THEN
ZPOW = TGEAR(THROT)
POW = TGEAR(THROT)
ENDIF
C
C Throttle gearing
C
CPOW = TGEAR(THROT)
C
C Actual power lag
c ...bypass first order lag, if TENLAG = 0
C
IF (TENLAG .GE. 0.5) THEN
CALL PDOT(POW,CPOW,ZPOW)
ELSE
POW = CPOW
ENDIF
C
C Gross thrust look-up table (look up table in metric)
C ...We have no mass flow data, so we can't compute ram drag
C and hence net thrust
C
CALL THRUST(POW,ALT,AMACH,GTHRUST)
C
C**********************************************************
C*** Engine sound variable ***
C**********************************************************
C
C Scale the engine sound variable for a 20.0 idle value
C
IF (POW .LE. 50.0) THEN
RPMSND = POW / 50.0 * 80.0 + 20.0
ELSE
RPMSND = POW + 50.0
ENDIF
C
C**********************************************************
C*** Engine forces ***
C**********************************************************
C
THTL = THTLN
PSTL = PSTLN
C
C Evaluate sines and cosines of thrust line orientation in body axes.
C
CTHTL = COS(THTL)
STHTL = SIN(THTL)
:
:
into either
REAL A00786,A00787
REAL A00788,A00789
REAL A00790,A00791
REAL TGEAR
SAVE
IF (I00727 .EQ. 1) THEN
A00746=TGEAR(A00730)
A00743=TGEAR(A00730)
ENDIF
A00736=TGEAR(A00730)
IF (A00729 .GE. 0.5) THEN
CALL PDOT(A00743,A00736,A00746)
ELSE
A00743=A00736
ENDIF
CALL THRUST(A00743,A00724,A00725,A00745)
IF (A00743 .LE. 50.0) THEN
A00744=A00743/50.0*80.0+20.0
ELSE
A00744=A00743+50.0
ENDIF
A00786=A00731
A00765=A00728
A00751=COS(A00786)
A00785=SIN(A00786)
:
:
removing all comments, but retaining TGEAR
and THRUST
, or even further to
REAL A00786,A00787
REAL A00788,A00789
REAL A00790,A00791
REAL A00792
SAVE
IF (I00727 .EQ. 1) THEN
A00746=A00792(A00730)
A00743=A00792(A00730)
ENDIF
A00736=A00792(A00730)
IF (A00729 .GE. 0.5) THEN
CALL A00795(A00743,A00736,A00746)
ELSE
A00743=A00736
ENDIF
CALL A00796(A00743,A00724,A00725,A00745)
IF (A00743 .LE. 50.0) THEN
A00744=A00743/50.0*80.0+20.0
ELSE
A00744=A00743+50.0
ENDIF
A00786=A00731
A00765=A00728
A00751=COS(A00786)
A00785=SIN(A00786)
:
:
to retain only Fortran intrinsic definitions.
As one isn’t obliged to push all branches into a remote git repository, development in «clear text» would remain local on infrastructure potentially easier controlled by you. It were up to you to whitelist the access to only those you trust, which obviously can be modular. The public git repository then is constrained to be a show case of results and examples of application of your program.