# Genie modularize @app logic

**URL:** https://discourse.julialang.org/t/genie-modularize-app-logic/131373
**Category:** Web Stack
**Tags:** question, package, module, genie
**Created:** [August 5, 2025, 12:40pm UTC](https://discourse.julialang.org/t/genie-modularize-app-logic/131373 "2025-08-05T12:40:20Z")
**Posts on this page:** 1
**Page:** 1

<div class="post-metadata">

### Author: ![vh94](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vh94/32/209232_2.png) [@vh94](https://discourse.julialang.org/u/vh94)
#### Post date: [August 5, 2025, 12:40pm UTC](https://discourse.julialang.org/t/genie-modularize-app-logic/131373/1 "2025-08-05T12:40:21Z")

</div>

**Is there a way to programmatically initialize @in and @out vars in GenieFramework.jl ?**

I would like to call a type of constructor from a module sever logic using namespaces , `:tree`, `:ghost`, to not have to initialize everything explicitly inside the main App function :

```julia-auto
@app begin

  @in ghostname = "Genie"
  @in ghostmessage = "nothing to report"
  @out ghostage = 9878

  @in treename = "Oak"
  @in treemessage = "nothing to report"
  @out treeage = 234
end

```

Eqivalent to an UI constructor that creates identical input cards with name-spaced variables:

```julia-auto
function ui_elem(ns::String, name::String="name", age::String = "age", message::String = "message")

    name_ns,age_ns,message_ns = Symbol.(Symbol(ns),[name,age,message])

      row([
      cell(class="st-module",[

        h4("Module of :$ns"),
        textfield("Enter your name $ns", name_ns,filled = String(name_ns)),
        p("Your age is {{age_ns}} ; $age_ns"), # how to display outvars?
        textfield("Enter your concern", message_ns, filled =String(message_ns)),
      ])
    ])
end

```

called inside main UI in `App.jl`:

```julia-auto
function ui()
  [
    h1("modularized app"),
    [ui_elem(i) for i in ["ghost","tree"] ]...,
    p("A Ghost of the name {{ghostname}} and age {{ghostage}} years thinks: {{ghostmessage}}"),
    p("A tree of the name {{treename}} and age {{treeage}} thinks {{treemessage}}"),

  ]
end

```

_How would an compaignon constructor for @in and @out reactive vars look like?_

#### Can the code be boundled in a generic module `/lib/Being.jl`?

In Rshiny the design pattern of shiny-modules allows to boundle “server” and “ui” logic in a namespaced module, I tried to achieve a similar thing in `GenieFramework.jl` and modules in `/lib/` but its unclear to me how/where to initialize/scope/pass variables?

> **./lib/Being.jl**
>
> ```julia-auto
> module Being
> using GenieFramework
> @genietools
> export name # how to IO reactives ?
> name = "testname"
> 
> # have a sub server function define the routing here ...
> # or define a constructor method.
> # create name spaced- ui vars
> # available in App.jl @app available (containment ie MyNS.var ?)
> @app begin
> @in name = "Name of arbitrary Being Module"
> @out age = 1
> @in message = "Message of arbitrary Being"
> @out info = hcat(name,age,message)
> @onchange message begin
> info = hcat(name,age,message)
> age += 1
> end 
> end
> 
> function ui_being(name::Symbol,age::Symbol,message::Symbol)
> row([
> cell(class="st-module",[
> h4("Module of ?"),
> textfield("Enter your name", name,ref="n",filled = "Name of arbitrary Being"),
> p("Your age is {{age}}"),
> textfield("Enter your concern", message,ref="nm", filled ="Message of arbitrary Being"
> ),
> ])
> ])
> end
> end
> 
> ```

> **./App.jl**
>
> ```julia-auto
> module App
> using Main.Being
> using GenieFramework
> @genietools
> 
> @app begin
> 
> ## i would like to call a type of constructor for the modules sever logic...
> # using three namespaces :being , :ghost , :tree
> @in ghostname = "Genie"
> @in ghostmessage = "nothing to report"
> @out ghostage = 9878
> 
> @in treename = "Oak"
> @in treemessage = "nothing to report"
> @out treeage = 234
> 
> @in beingname ="APP Name of arbitrary Being"
> @in beingmessage = "APP Message of arbitrary Being"
> @out beingage = 99
> 
> ### ""Main" APP logic"
> @in refresh = false
> @out report = "no new messages"
> @onchange refresh begin
> report = "$(ghostmessage), $(treemessage), $(beingmessage)"
> treeage += 1
> ghostage += 1
> beingage +=1
> end
> end
> ## How to namespace if needed? (Modules // Scope)
> 
> function ui_elem(ns::String, name::String="name", age::String = "age", message::String = "message")
> name_ns,age_ns,message_ns = Symbol.(Symbol(ns),[name,age,message])
> row([
> cell(class="st-module",[
> h4("Module of :$ns"),
> textfield("Enter your name $ns", name_ns,filled = String(name_ns)),
> p("Your age is {{age_ns}} ; $age_ns"), # how to display outvars?
> textfield("Enter your concern", message_ns, filled =String(message_ns)),
> ])
> ])
> end
> 
> function ui_contor()
> row([
> cell(class="st-module",[
> p("------------------------------"),
> p("An aritrary module ? named {{beingname}} of age {{beingage}} thinks {{beingmessage}}"),
> p("A Ghost of the name {{ghostname}} and age {{ghostage}} years thinks: {{ghostmessage}}"),
> p("A tree of the name {{treename}} and age {{treeage}} thinks {{treemessage}}"),
> p("------------------------------"),
> p("---- REPORT on Update -------"),
> p("{{ghostname}} and {{treename}} report: {{report}}. {{beingname}} says: {{beingmessage}} "),
> p("Modlue export var:: {{name}} exsist?"),
> button("collect reports", @click("refresh = !refresh")),
> ])
> ])
> end
> 
> function ui()
> [
> h1("modularized app"),
> [ui_elem(i) for i in ["ghost","tree"] ]...,
> Being.ui_being(:beingname,:beingage,:beingmessage), # A = Being(ns ="A"); A.name, A.age, A.message ??
> ui_contor()
> ]
> end
> 
> include("./lib/Being.jl")
> @page("/", ui)
> end
> 
> ```
